【问题标题】:date import, incorrect century日期导入,世纪不正确
【发布时间】:2012-08-01 23:29:07
【问题描述】:

我有一堆要解析的日期,格式为“%m/%d/%y”。 as.Date(dates, format = "%m/%d/%y") 将“1/01/64”之类的日期转换为“2064-01-01”,但我需要将其设为“1964-01-01”。我想我可以找到未来年份的实例,然后减去一个世纪,但这似乎有点荒谬。

【问题讨论】:

    标签: r date


    【解决方案1】:

    日期在内部存储为整数天,因此在输入或输出时只有这样的格式。至于没有世纪信息的输入,我认为你不走运。以下是 ?strptime 关于 %y 格式规范的说明:“在输入时,值 00 到 68 以 20 为前缀,而 69 到 99 以 19 为前缀——这是 2004 年和 2008 年 POSIX 标准指定的行为,但他们也说 '预计在未来的版本中,从 2 位数年份推断的默认世纪将发生变化。”

      as.Date( "01/01/64", "%m/%d/%y", origin="1970-01-01") -100*365.25
      #[1] "1964-01-01"
    

    鉴于 Y2K 是最近的过去,可能会针对允许删除世纪信息的程序员发起一场酒吧大战。

    由于默认是假设00-68年是2000-2068,当然可以创建一个as.Dateshift

    【讨论】:

    • 当日期出错时,我最终只使用条件来减去一个世纪。当然最好有 4 位数年份的数据,但是你不能指定解析函数的行为有点蹩脚。
    • 问题是你说谁“跛脚”?
    • 哈,我想这是我认为很适合 as.Date 函数的功能。我也不确定 POSIX 标准背后的逻辑来自哪里。 Ofc 两者可能都有很好的理由......
    【解决方案2】:

    另一种修复日期的方法是将未来发生的所有年份(相对于使用 Sys.Date() 的今天日期)更改为从 19 开始而不是 20。

    dates=as.Date(c("01/01/64", "12/31/15"))
    # [1] "2064-01-01" "2015-12-31" ## contains an incorrect date
    
    ## Now correct the dates that havn't yet occurred
    as.Date(ifelse(dates > Sys.Date(), format(dates, "19%y-%m-%d"), format(dates)))
    #[1] "1964-01-01" "2015-12-31"
    

    【讨论】:

      猜你喜欢
      • 2019-09-08
      • 2017-11-14
      • 2021-08-11
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      相关资源
      最近更新 更多