【问题标题】:Subsetting POSIXct, losing timezone子集 POSIXct,丢失时区
【发布时间】:2015-01-15 20:50:57
【问题描述】:

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

【问题讨论】:

  • 你为什么不直接用subset() 子集dt1

标签: r posixct


【解决方案1】:

你有几个问题:

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

要解决 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>

对于第二点,属性复制规则并不总是超级直观,[&lt;- 有删除属性的趋势。毕竟,您是否需要来自 LHS 或 RHS 的属性并不总是很清楚。对于您的具体问题,您可以按照@BondedDust 建议的方式设置属性

【讨论】:

  • R 中的日期时间是错误的源头。
  • 谢谢。我以前没有使用过NA_character_,并且很乐意将.POSIXct 用于分配。感谢您的解释。
  • @joeln,你甚至不需要NA_character_as.POSIXct(NA) 也可以。
  • 为了可能帮助未来的 Google 员工,我使用 dplyr 来实现这一点,但在返回的表只有一行时。当我有 > 1 行时,tzone 属性被删除,但我正好有 1 行,这打破了我的rbind_all。手动剥离 tzone 属性对我来说是诀窍。
【解决方案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"

【讨论】:

  • 谢谢。我试过&gt; attr(df$subsetDate[1],"tzone") &lt;- attr(dt1,"tzone"),但没有用。不幸的是,这并不能完全解决问题,因为结果向量仍然不能用数学运算。
  • 嗯,它起作用了,但它并没有达到你想要的“+”运算符的效果。
  • 是的,谢谢,您确实为我最初描述的问题提供了解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 2017-07-27
  • 2019-11-07
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多