1

每隔一段时间,我就会发现一个真正的挠头……知道这里发生了什么吗?

> 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?我觉得我一定是错过了什么。

4

2 回答 2

4

a当您减去一个月时,您的日期在技术上是 dst 。除非您还更改了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"
于 2012-06-08T19:52:28.143 回答
3

这 ( 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

根据您的语言环境和时区设置等,如果没有任何进一步的信息,我不得不猜测在您的语言环境/时区中,您从元素中减去 1a $mon指示的日期/时间不存在。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
于 2012-06-08T19:43:16.607 回答