请参阅下面的R.我是从更大的时间序列(var dt1
代表)的子集,并且时区正在被删除。有什么建议?
> dt1 <- as.POSIXct("2011-07-01 13:42:00", tz="America/New_York")
> dt1
[1] "2011-07-01 13:42:00 EDT"
> attr(dt1,"tzone")
[1] "America/New_York"
> df <- data.frame(subsetDate=.POSIXct(character(3)), otherData=numeric(3))
> df$subsetDate[1] <- dt1
df
subsetDate otherData
1 2011-07-01 13:42:00 0
2 <NA> 0
3 <NA> 0
> attr(df$subsetDate[1],"tzone")
NULL
除了丢弃tz之外,另一个问题是,虽然结果仍然被识别为str()
为POSIXct,但我不能再在那些日期做数学。
> str(df$subsetDate)
POSIXct[1:5], format: "2011-07-01 13:42:00" NA NA
> df$subsetDate[1]+3600
Error in unclass(e1) + unclass(e2) :
non-numeric argument to binary operator
答案 0 :(得分:4)
你有几个问题:
.POSIXct
代替as.POSIXct
是一个坏主意;它是一个不可用的内部功能;除此之外,它实际上并没有像as.POSIXct
那样将日期的内部表示转换为数字(这就是为什么数学无法工作)。[<-
删除属性要解决1,请使用:
df <- data.frame(subsetDate=as.POSIXct(NA_character_, format=""), otherData=numeric(3))
数学将适用于上表:
> df$subsetDate[1] <- dt1
> df
subsetDate otherData
1 2011-07-01 13:42:00 0
2 <NA> 0
3 <NA> 0
> df[1] + 3600
subsetDate
1 2011-07-01 14:42:00
3 <NA>
2 <NA>
对于第二点,属性复制规则并不总是超级直观,[<-
倾向于删除属性。毕竟,并不总是清楚您是否需要来自LHS或RHS的属性。对于您的具体问题,您可以按@BondedDust建议的方式设置属性
答案 1 :(得分:2)
您可以将其添加回来:
attr(df[ ,'subsetDate'], "tzone") <- attr(dt1,"tzone")
在作为数据框打印时它不会显示,但它现在在那里:
> df
subsetDate otherData
1 2011-07-01 13:42:00 0
2 <NA> 0
3 <NA> 0
> attr(df[ ,'subsetDate'], "tzone")
[1] "America/New_York"