日期格式不同的错误差异

时间:2018-09-12 10:34:34

标签: r

我的约会日期如下:

[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 个答案:

答案 0 :(得分:4)

差不多只是正式化了上述评论:

问题:

  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

答案 1 :(得分:1)

在我们眼中,我们立即看到(假设我们在2018年写这篇文章)30-09-18的意思是公元2018年9月30日;但是,计算机(即R)需要一些帮助(封装在format字符串中)。

您已经告诉您输入的最后一部分是%Y格式的;因此,它按照?strptime中的说明进行了解释:

  

有世纪的年份。 [...]

因此,R看到30-09-18并认为“公元18年9月30日”。当然是很久以前了:

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

要解决此问题,请?strptimeyear上方便的 Ctrl F 可以帮助识别正确的选项%y

  

没有世纪的年份(00–99)。输入时,0068的值以20为前缀,6999的前缀为19 –这是2004年指定的行为和2008 POSIX标准,但是他们也说“预计在将来的版本中,从两位数年份推断出的默认世纪将会改变”。

然后是预期结果:

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

经验不足,遇到意外行为时,请始终对?strptime手册进行三重检查... Speaking from experience!