#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