Преобразование времени POSIXt в юлианский день

#r #date #transform #posixct

#r #Дата #Преобразовать #POSIXct

Вопрос:

Я искал способ преобразовать дату в формате POSIXct в юлианский день _ Номер Юлианского дня (JDN) — это целое число, присвоенное целому солнечному дню в подсчете дней по юлианскому времени, начиная с полудня по Всемирному времени, с номером 0 по юлианскому дню, присвоенным дню, начинающемуся в полдень в понедельник, 1 января4713 год до н.э., пролептический юлианский календарь (24 ноября 4714 года до н.э. по пролептическому григорианскому календарю) _

Но я только что понял, как сделать год от 1 до 365 для високосного года. Может кто-нибудь помочь мне найти какую-нибудь функцию, которая превращает даты POSIXct (например: 2010-10-02 21:00:00) в юлианские даты?

У меня есть столбец в фрейме данных с несколькими датами, которые нужно преобразовать в юлианские дни.

 head(head(all_jub2$timestamp_adjusted)
[1] 2010-10-02 21:00:00 2010-10-03 03:00:00 2010-10-03 09:00:00 2010-10-03 15:00:00
[5] 2010-10-03 21:00:00 2010-10-04 03:00:00
6120 Levels: 2003-10-17 21:00:00 2003-10-18 03:00:00 ... 2020-01-10 09:00:00
  

Ответ №1:

lubridate Пакет упрощает работу с датами. Решает ли это вашу проблему?

 library(lubridate)

date <- as.POSIXct('2010-10-02 21:00:00')

julian <- yday(date)
  

Ответ №2:

Вы можете сделать это с помощью base R при условии, что вы начнете с правильной точки. Текст в вашем вопросе о ваших данных по-прежнему является переменной a factor -типа. Это нехорошо — вам нужно проанализировать это, и, например anytime() , функция пакета anytime может вам помочь. Смотрите Другие вопросы здесь по этому поводу.

Вернемся к вопросу. Если вы начнете с POSIXct переменной из текущего времени и для аргументации час назад, чтобы иметь вектор, мы можем а) преобразовать его в Date , а затем б) из Date в юлианский:

 R> input <- Sys.time()   c(-3600,0)
R> input
[1] "2020-09-29 13:07:50.225898 CDT" "2020-09-29 14:07:50.225898 CDT"
R> as.Date(input)
[1] "2020-09-29" "2020-09-29"
R> julian(as.Date(input))
[1] 18534 18534
attr(,"origin")
[1] "1970-01-01"
R> 
  

Итак, на сегодня наша юлианская дата — 18534. Для ваших первых двух точек данных мы получаем 14884 и 14885.

 R> input <- c("2010-10-02 21:00:00", "2010-10-03 03:00:00")
R> anytime::anydate(input)
[1] "2010-10-02" "2010-10-03"
R> julian(anytime::anydate(input))
[1] 14884 14885
attr(,"tzone")
[1] "America/Chicago"
attr(,"origin")
[1] "1970-01-01"
R> 
  

Если вам нужен только день года, вы получаете его как компонент yday POSIXlt представления, но вам нужно скорректировать на единицу, поскольку оно основано на нуле:

 R> as.POSIXlt(anytime::anytime(input))$yday   1
[1] 275 276
R> 
  

Ответ №3:

Спасибо за ответы, но я нашел то, что искал, используя пакет insol

 library(insol)

julian_day <- insol::JD(as.POSIXct('2010-10-02 21:00:00'))
[1] 2455473