【问题标题】:Julian date to calendar date in R with decimals儒略日期到带有小数的R中的日历日期
【发布时间】:2020-12-21 09:41:09
【问题描述】:

我有一个带有儒略日期格式的数据框:

2455764.833333
2455764.875000
2455764.916667
dput <- structure(list(date = structure(c(2L, 1L, 1L, 1L, 1L), .Label = c("", 
"2011-07-21T20:00:00"), class = "factor"), longitude = structure(c(1L, 
1L, 1L, 1L, 1L), .Label = "-6.396", class = "factor"), latitude = structure(c(1L, 
1L, 1L, 1L, 1L), .Label = "56.6283", class = "factor"), julian = structure(1:5, .Label = c("2455764.833333", 
"2455764.875000", "2455764.916667", "2455764.958333", "2455765.000000"
), class = "factor"), record_no = 1:5, temp = structure(c(1L, 
3L, 2L, 4L, 5L), .Label = c("12.414", "12.463", "12.515", "12.618", 
"12.767"), class = "factor"), depth = structure(c(1L, 1L, 1L, 
1L, 1L), .Label = "  34.00", class = "factor")), row.names = c(NA, 
5L), class = "data.frame")

在线 Julian 日期转换器可以正确转换(上面是 2011 年 7 月 22 日)-但除了日期之外,我还需要小数点后详细信息中的时间元素。

起源于公元前 4713 年 1 月 1 日。我读过 as.Date 不处理 BC 日期。如果我将 $julian 转换为数字,它会删除小数点后的数据。

我从这里尝试了各种建议,但没有找到任何适用于 BC 原点和时间元素的建议。

tiree$date2 <- as.Date(tiree$julian, origin = structure(-2440588, class = "Date"))

来自Convert Julian Date to Date - R 给我 charToDate(x) 中的错误:字符串不是标准的明确格式(编辑:根据转换为数字的建议,错误已删除但输出不正确)。

欢迎任何建议 - 我想我可能遗漏了一些明显的东西!

非常感谢

【问题讨论】:

  • 试试tiree$date2 &lt;- as.Date(as.numeric(tiree$julian), origin = structure(-2440588, class = "Date"))
  • 感谢@Ronak Shah - 它确实解决了明确的格式错误,但遗憾的是,这种方法并没有给出正确的日期/时间元素。
  • 请提供dput(head(tiree$julian))
  • 已编辑添加 dput
  • @Bun 干得好,在这里共享数据时必须始终使用dput,这样我们才能看到您的数据结构。您可以在这里了解更多信息:how-to-make-a-great-r-reproducible-example

标签: r julian-date


【解决方案1】:

您有因子数据,需要convert properly to numeric

origin 似乎也不正确。我们无法提前计算天数(as.Date 使用的天数),并且必须考虑 as.POSIXlt 使用的秒数(参见 cmets 中的讨论)。

dat <- transform(dat, 
                 ## date version
                 julian2=as.Date(as.numeric(levels(julian))[julian], 
                                 origin=structure(-2440588, class = "Date")),
                 ## date-time version
                 julian3=as.POSIXlt(as.numeric(levels(julian))[julian]*86400, 
                                    origin=structure(-210866760000, 
                                                     class=c("POSIXct", "POSIXt"),
                                                     tzone="GMT"),
                                    tz="GMT"))

结果

dat[c("julian", "julian2", "julian3")]  ## relevant columns selected
#           julian    julian2             julian3
# 1 2455764.833333 2011-07-21 2011-07-22 07:59:59
# 2 2455764.875000 2011-07-21 2011-07-22 09:00:00
# 3 2455764.916667 2011-07-21 2011-07-22 10:00:00
# 4 2455764.958333 2011-07-21 2011-07-22 10:59:59
# 5 2455765.000000 2011-07-22 2011-07-22 12:00:00

【讨论】:

  • 谢谢@jay.sf - 我可以从数字中得到它,正如 Ronak shah 早些时候建议的那样 - 但我需要的主要是除了日期之外的小数点后的时间(你可以看到每个日期有多行),这种方法没有给出。再次感谢。
  • @Bun 我知道,只是注意到,你想要as.POSIXct 而不是as.Date。由于as.POSIXct 用秒计算,而as.Date 用天计算,我们需要乘以一天中的秒数,即86400。可能86400 + 1date 列完全匹配。见编辑。
  • 太棒了,非常感谢@jay.sf - 我整个早上都在努力寻找这个问题的答案,但感觉这很简单 - 你为我节省了几个小时。
  • 我不是 R 程序员,但对朱利安日期很熟悉。 @jay.sf 答案似乎是错误的。根据美国海军天文台的多年计算机交互年鉴,2455764.833333 UT = 2011 Jul 22 08:00:00.0 Fri; 2455764.875000 UT = 2011 年 7 月 22 日 09:00:00.0 星期五; 2455764.916667 UT = 2011 年 7 月 22 日 10:00:00.0 星期五; 2455764.958333 UT = 2011 年 7 月 22 日 11:00:00.0 星期五; 2455765.000000 UT = 2011 年 7 月 22 日 12:00:00.0 星期五。朱利安日期从中午开始,并且总是带有某种世界时的味道。
  • @GerardAshton 是的 "Date" 只能处理整数,因此我们必须使用“POSIX”格式。我相信我已经弄清楚了,请参阅编辑! structure(-210866760000, class=c("POSIXct", "POSIXt"), tzone="GMT") 现在计算为 "-4713-11-24 12:00:00 GMT"。剩余的秒数偏差似乎是四舍五入的问题。
猜你喜欢
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2013-07-21
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多