代码之家  ›  专栏  ›  技术社区  ›  Robert Long

不同格式的日期差异不正确

r
  •  1
  • Robert Long  · 技术社区  · 7 年前

    [474] "26-08-18" "1-09-18" "1-09-18"  "1-09-18"  "1-09-18"  "2-09-18" 
    

    我想减去另一个日期,但我发现以下问题:

    > (fdate <- as.Date(Sys.Date(), format="%Y-%m-%d"))
    [1] "2018-09-12"
    > as.Date("30-09-18", format="%d-%m-%Y") - fdate
    Time difference of -730467 days
    

    我用计算机解决了这个问题 lubridate 包装如下:

    > lubridate::dmy("30-09-18") - as.Date(Sys.Date())
    Time difference of 18 days
    

    但是我很惊讶 as.Date (并说明 format )不起作用。为什么?[或者更确切地说,我在R基地做错了什么?]

    2 回复  |  直到 7 年前
        1
  •  1
  •   MichaelChirico    7 年前

    在我们看来,我们立即看到(鉴于我们在2018年写这篇文章) 30-09-18 是指2018年9月30日CE;但是,计算机(即R)需要一些帮助(封装在 format

    你已经告诉它你的最后一部分意见是 %Y ?strptime

    与世纪 . [...]

    所以,R看到了 30-09-18

    as.Date("30-09-18", format="%d-%m-%Y") - as.Date('2018-09-12')
    # Time difference of -730467 days
    

    应该是2000年前吧?

    730467/365.25 # rudimentary accounting for leap years/centuries
    # [1] 1999.91
    

    为了解决这个问题,一个方便的 F级 对于 year 有助于确定正确的选项, %y :

    无世纪年( 00–99 00 68 前缀为 20 69 99 通过 19 这是2004年和2008年POSIX标准规定的行为,但他们也表示,预计在未来版本中,从两位数年份推断出的默认世纪将发生变化。

    as.Date("30-09-18", format="%d-%m-%y") - as.Date('2018-09-12')
    # Time difference of 18 days
    

    教训是,一定要反复检查 遇到意外行为时手动。。。 Speaking from experience!

        2
  •  4
  •   RK1 w--    7 年前

    几乎只是将上述评论形式化:

    问题:

    1. 截止日期转换

    as.Date("30-09-18", format="%d-%m-%Y")

    输出: [1] "0018-09-30"

    通过指定“%Y”,它期望的是yyyy输入,因此在您的示例中假定为0018

    as.Date("30-09-18", format="%d-%m-%y")
    

    : [1] "2018-09-30"

    因此

    as.Date("30-09-18", format="%d-%m-%y") - Sys.Date()
    

    Time difference of 18 days