我的约会日期如下:
[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中做错了什么?]
答案 0 :(得分:4)
差不多只是正式化了上述评论:
问题:
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
要解决此问题,请?strptime
上year
上方便的 Ctrl F 可以帮助识别正确的选项%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
经验不足,遇到意外行为时,请始终对?strptime
手册进行三重检查... Speaking from experience!