子集 POSIXct,丢失时区

Subsetting POSIXct, losing timezone

请看下面的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

你可以加回去:

  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"

您有几个问题:

  1. 使用 .POSIXct 而不是 as.POSIXct 是个坏主意;它是一项内部功能,不打算提供;除其他外,它实际上并没有像 as.POSIXct 那样将日期的内部表示形式转换为数字(这就是数学不起作用的原因)。
  2. [<- 掉落属性

要解决 1,请使用:

df <- data.frame(subsetDate=as.POSIXct(NA_character_, format=""), otherData=numeric(3))

数学将适用于上述 table:

> 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 建议的方式设置属性