【问题标题】:Failed to convert serial date numbers to the right date无法将序列日期编号转换为正确的日期
【发布时间】:2017-01-31 15:11:54
【问题描述】:

我从一个 csv 文件中读取了一个数字列表。它包括像731961,731962,731966,731967,731968 这样的数字,它们应该对应于2004-01-15,2004-01-16,2004-01-20,2004-01-21,2004-01-22

但是,当我尝试在 R 中转换数字时,结果日期是错误的,例如,as.Date(731961,origin="1900-01-01") --> "3904-01-17"

我在这里做错了什么?

【问题讨论】:

  • as.Date 使用整数给出从指定原点开始的天数。从 1900 年开始的 731+ 千天大约是 2000 年。
  • 试试 origin="0-01-01".

标签: r date


【解决方案1】:

跟进 cmets,问题是日期来源不正确。你可以看到,如果你计算日期,看看它们有多远:

inDates <- c(731961,731962,731966,731967,731968)
correctDates <- as.Date(c("2004-01-15","2004-01-16","2004-01-20","2004-01-21","2004-01-22"))

wrongDates <- as.Date(inDates, origin = "1900-01-01")

difftime(wrongDates, correctDates, units = "days")

它们距正确日期相差 693,962 天,表明来源不正确。正如@Haboryme 所建议的那样,将原点设置为0-01-01 接近了,但仍然关闭了一天。我的猜测是存在闰日错误,或者序列号希望 0 年的 1 月 1 日为 1 而不是 0。我无法将原点设置为 BCE 日期(可能有一种方法,但是当我找到工作时,我抓住了它)。所以,我从输入日期中减去一个,并设置原点

as.Date(inDates - 1, origin = "0000/01/01")

不过,这也暗示了另一种选择。如果您经常有这样的序列号日期,并且原产地发生变化,那么到处寻找原产地是后端的痛苦。但是,如果您知道一些日期,并且可以确认它们都使用相同的原点,则可以从每个新输入中减去上面的 offBy 以获得正确的日期(只要您使用相同的原点)。

as.Date(inDates - as.numeric(offBy[1]), origin = "1900-01-01")

也给出正确的日期。

【讨论】:

    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多