R中的另一个POSIXlt窘境

时间:2012-06-08 19:31:00

标签: r time base

每隔一段时间我就会发现一个真正令人头疼的问题......任何想法在这里发生了什么?

> 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但不能编辑?我觉得我必须遗漏一些东西。

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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

根据您的区域设置和时区设置等没有任何进一步的信息,我必须在您的区域设置/时区猜测{/ 1}} 指示的日期/时间之后从a元素中减去1不存在。 R对这些事情非常聪明,但是时区和地区通常会让人们失望。

真正的问题是,为什么在处理日期时使用日期/时间对象? 在这个例子中,$mon就足够了。

我的R会议详情:

a <- as.Date("2003-11-01", "%Y-%m-%d")