在工作中,我们最近在我们的代码中发现了一个不寻常的行为,我已经将它钉在了下面的语句中,其值为FALSE,它应该为TRUE:
! strptime(strftime((strptime(d, "%Y-%m-%d")+3600*24),"%Y-%m-%d"),"%Y-%m-%d")%in%strptime(VsiB[,1],"%Y-%m-%d")
VsiB是某些日期和值的数据框:
DATEFROM VALUE
1 2016-12-15 59.43073
2 2016-12-16 62.78324
3 2016-12-19 54.06673
4 2016-12-26 50.50698
5 2017-01-02 51.20186
6 2017-01-09 52.52000
7 2016-12-17 52.72573
和d是此数据框的日期(此情况下的问题发生在d = 2016-12-17)。 如果d的下一个日期包含在数据帧VsiB中,则此语句基本上是检查。嗯,在这种情况下,它是不可能的。
真正好奇的部分是,对于所有其他国家(我们循环了24个国家/地区的整个代码,其中5个使用与发生错误的国家/地区完全相同的数据),该声明是的。
直到今天它也只发生过两次,即使我们每天都运行两次。
我们能想到的唯一解释是
strptime(strftime((strptime(d, "%Y-%m-%d")+3600*24),"%Y-%m-%d")
没有添加一天(注意+ 3600 * 24)到d。例如,
strptime(strftime((strptime(d, "%Y-%m-%d")+3600*24-epsilon),"%Y-%m-%d")
对于epsilon> 0,将获得d,而不是d + 1。所以我的问题是,如果有可能某些外部条件,如系统时间等,可能会使计算失真,那会发生吗?
PS:我知道as.Date(d)+1会以优雅的方式解决它,但我仍然很好奇,如果strptime可能无法正常工作(加上任何改变都可能导致问题。 )。Sys.timezone() [1]“欧洲/布拉格” sessionInfo() R版本3.1.2(2014-10-31) 平台:x86_64-w64-mingw32 / x64(64位)
区域设置:
[1] LC_COLLATE = Slovenian_Slovenia.1250 LC_CTYPE = Slovenian_Slovenia.1250
[3] LC_MONETARY = Slovenian_Slovenia.1250 LC_NUMERIC = C
[5] LC_TIME = Slovenian_Slovenia.1250附加基础包: [1] stats graphics grDevices utils数据集方法库
通过命名空间加载(而不是附加): [1] rsconnect_0.4.3 tools_3.1.2
数据:
VsiB <- structure(list(DATEFROM = structure(c(17150, 17151, 17154, 17161,
17168, 17175, 17152), class = "Date"), VALUE = c(59.43073, 62.78324,
54.06673, 50.50698, 51.20186, 52.52, 52.72573)), .Names = c("DATEFROM",
"VALUE"), class = "data.frame", row.names = c(NA, -7L))