子集POSIXct,丢失时区

时间:2015-01-15 20:50:57

标签: r posixct

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

2 个答案:

答案 0 :(得分:4)

你有几个问题:

  1. 使用.POSIXct代替as.POSIXct是一个坏主意;它是一个不可用的内部功能;除此之外,它实际上并没有像as.POSIXct那样将日期的内部表示转换为数字(这就是为什么数学无法工作)。
  2. [<-删除属性
  3. 要解决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"