每隔一段时间,我就会发现一个真正的挠头......知道这里发生了什么吗?
> a = strptime("2003-11-01", "%Y-%m-%d")
> b = strptime("2004-01-31", "%Y-%m-%d")
> unlist(a)
sec min hour mday mon year wday yday isdst
0 0 0 1 10 103 6 304 0
> unlist(b)
sec min hour mday mon year wday yday isdst
0 0 0 31 0 104 6 30 0
> a$mon = a$mon-1
> b$mon = b$mon-1
> a=as.POSIXlt(as.POSIXct(a))
> b=as.POSIXlt(as.POSIXct(b))
> a
[1] NA
> b
[1] "2003-12-31 PST"
> unlist(a)
sec min hour mday mon year wday yday isdst
NA NA NA NA NA NA NA NA -1
> unlist(b)
sec min hour mday mon year wday yday isdst
0 0 0 31 11 103 3 364 0
为什么我可以编辑 b 但不能编辑 a? 我觉得我一定错过了什么。
减去一个月时,您的a
日期在技术上以夏令时为单位。除非您还更改了 isdst
属性,否则它不是有效的日期。
> a <- strptime("2003-11-01", "%Y-%m-%d")
> a2 <- a
> a$mon <- a$mon - 1
> as.POSIXct(a)
[1] NA
> a2$mon <- a2$mon - 1
> a2$isdst <- 1
> as.POSIXct(a2)
[1] "2003-10-01 EDT"
这 ( a
) 适用于我,R 和会话详细信息如下:
> a$mon = a$mon-1
> a=as.POSIXlt(as.POSIXct(a))
> a
[1] "2003-10-01 01:00:00 BST"
> unlist(a)
sec min hour mday mon year wday yday isdst
0 0 1 1 9 103 3 273 1
根据您的区域设置和时区设置等没有任何进一步的信息,我将不得不猜测在您的区域设置/时区中,从$mon
元素中减去 1 后由 a
指示的日期/时间不存在。R在这些事情上非常聪明,但时区和区域设置经常吸引人们。
真正的问题是,当您只处理日期时,为什么要使用日期/时间对象? 在此示例中,a <- as.Date("2003-11-01", "%Y-%m-%d")
就足够了。
我的R会话的详细信息:
> sessionInfo()
R version 2.15.0 Patched (2012-04-14 r59019)
Platform: x86_64-unknown-linux-gnu (64-bit)
locale:
[1] LC_CTYPE=en_GB.utf8 LC_NUMERIC=C
[3] LC_TIME=en_GB.utf8 LC_COLLATE=en_GB.utf8
[5] LC_MONETARY=en_GB.utf8 LC_MESSAGES=en_GB.utf8
[7] LC_PAPER=C LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_GB.utf8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods
[7] base
other attached packages:
[1] ggplot2_0.9.1
loaded via a namespace (and not attached):
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2
[4] grid_2.15.0 labeling_0.1 MASS_7.3-18
[7] memoise_0.1 munsell_0.3 plyr_1.7.1
[10] proto_0.3-9.2 RColorBrewer_1.0-5 reshape2_1.2.1
[13] scales_0.2.1 stringr_0.6 tools_2.15.0