【问题标题】:Odd POSIXct Function Behavior In RR中的奇怪POSIXct函数行为
【发布时间】:2015-12-06 00:10:44
【问题描述】:

我正在使用 R 中的 POSIXct 数据类型。在我的工作中,我合并了一个函数,该函数在向量中返回两个 POSIXct 日期。但是,我发现了一些意想不到的行为。我写了一些示例代码来说明我的问题:

# POSIXct returning issue:

returnTime <- function(date) {

  oneDay <- 60 * 60 * 24
  nextDay <- date + oneDay

  print(date)
  print(nextDay)

  return(c(date, nextDay))

}

myTime <- as.POSIXct("2015-01-01", tz = "UTC")

bothDays <- returnTime(myTime)
print(bothDays)

函数中的打印语句给出:

[1] "2015-01-01 UTC"
[1] "2015-01-02 UTC"

虽然代码末尾的打印语句给出:

[1] "2014-12-31 19:00:00 EST" "2015-01-01 19:00:00 EST"

我了解发生了什么,但我不明白为什么。这可能是一个让我难以理解的简单错误,但我真的很困惑。我不明白为什么返回时时区会发生变化。该类仍然是 POSIXct,只是时区发生了变化。

此外,我做了与上面相同的操作,但只是返回了其中一个日期,并且日期的时区没有改变。我现在可以解决这个问题,但想看看是否有人对我的问题有任何见解。提前谢谢!


感谢以下帮助。我反而做了:

 return(list(date, nextDay))

这解决了我的时区被删除的问题。

【问题讨论】:

    标签: r function date vector return


    【解决方案1】:

    来自?c.POSIXct:

    在“POSIXlt”对象上使用c 会将它们转换为当前时区, 并且在“POSIXct”对象上删除任何“tzone”属性(即使它们 都标有相同的时区)。

    另见here。

    【讨论】:

    • 完美,感谢您的帮助。我最终只是将它传递到一个列表中,这解决了我的问题。
    【解决方案2】:

    问题是函数c去掉了时区属性:

    attributes(myTime)
    #$class
    #[1] "POSIXct" "POSIXt" 
    #
    #$tzone
    #[1] "UTC"
    
    attributes(c(myTime))
    #$class
    #[1] "POSIXct" "POSIXt"
    

    要修复,您可以例如使用data.table中的setattr函数,就地修改属性:

    (setattr(c(myTime), 'tzone', attributes(myTime)$tzone))
    #[1] "2015-01-01 UTC"
    

    【讨论】:

    • 谢谢!很好的解决方案。我最终只是传入了一个列表而不是一个向量,这就解决了我的问题。
    • 这样一个简单的操作不需要加载 data.table - attr(bothDays,"tzone") &lt;- attr(myTime,"tzone") 就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多