R的另一个困境

R的另一个困境,r,time,base,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 >

每隔一段时间我就会发现一个真正的抓狂。。。你知道这是怎么回事吗

> 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
)适用于我,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
如果没有根据您的区域设置和时区设置等提供任何进一步的信息,我只能猜测在您的区域设置/时区中,
a
$mon
元素中减去1后所指示的日期/时间不存在。R在这些方面相当聪明,但时区和地区往往会让人感到困惑

真正的问题是,当您只处理日期时,为什么要使用日期/时间对象?
a这(
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
如果没有根据您的区域设置和时区设置等提供任何进一步的信息,我只能猜测在您的区域设置/时区中,
a
$mon
元素中减去1后所指示的日期/时间不存在。R在这些方面相当聪明,但时区和地区往往会让人感到困惑

真正的问题是,当您只处理日期时,为什么要使用日期/时间对象?
a当你减去一个月时,你的
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"
>a a2 a$mon as.POSIXct(a)
[1] NA
>a2$mon a2$isdst as.POSIXct(a2)
[1] “2003-10-01美国东部夏令时”

当你减去一个月时,你的
日期在技术上是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"
>a a2 a$mon as.POSIXct(a)
[1] NA
>a2$mon a2$isdst as.POSIXct(a2)
[1] “2003-10-01美国东部夏令时”

与以下内容相关:。简短回答:不要更改POSIXlt对象的元素,并期望得到合理的结果。>a####[1]“2003-10-01”>未列出(a)#########################秒分钟小时MDA。。。。所以我得到了一个值,但它错误地告诉我这是“标准时间”。与:。简短回答:不要更改POSIXlt对象的元素,并期望得到合理的结果。>a####[1]“2003-10-01”>未列出(a)#########################秒分钟小时MDA。。。。所以我得到了一个值,但它错误地告诉我这是“标准时间”。至少在美国,夏令时在10月26日失效。因此,如果您只是从11月1日POSIXlt表示的月份部分减去1,那么您将创建一个不存在的时间对象。(简短版本:what@JoshuaUlrich说的)。没错。至少在美国,夏令时在10月26日失效。因此,如果您只是从11月1日POSIXlt表示的月份部分减去1,那么您将创建一个不存在的时间对象。(简短版本:what@JoshuaUlrich说的)。所以Linux做对了,MacOS做错了“isdst”标记。谢谢大家的回答。非常有用。我最终转换成了as.Date。处理起来容易多了!谢谢所以Linux做对了,MacOS做错了“isdst”标记。谢谢大家的回答。非常有用。我最终转换成了as.Date。处理起来容易多了!谢谢