【问题标题】:R not recognizing time component of datetime valuesR不识别日期时间值的时间分量
【发布时间】:2016-09-01 09:54:58
【问题描述】:

我有一个数据框,其中一列列出了一堆日期时间。奇怪的是,该列的数据类型是“整数”。我需要将列强制转换为适当的日期时间数据类型,例如 POSIXct,以便我可以从另一个字段中的时间戳中减去这些时间戳。但是,当我尝试将这些日期时间值强制转换为 POSIXct 时,它们会丢失时间部分。当我尝试在没有先强制转换为另一种数据类型的情况下对日期时间进行数学运算时,R 的行为就好像时间戳的时间部分不存在(它假设每个日期都有一个午夜的时间)。发生了什么,我该如何修复它以便 R 识别时间戳?

> dates[1]
[1] 2016-05-05T16:46:21-04:00
48 Levels: 2016-05-03T06:45:42-04:00 2016-05-03T06:45:43-04:00 ... 2016-05-05T16:50:00-04:00
> typeof(dates)
[1] "integer"
> as.POSIXct(dates[1])
[1] "2016-05-05 EDT"
> as.character(dates[1])
[1] "2016-05-05T16:46:21-04:00"
> as.POSIXct(as.character(dates[1]))
[1] "2016-05-05 EDT"

【问题讨论】:

  • 48 Levels 暗示 R 将其视为因子。如果您使用过read.csv,请使用stringAsFactors=F
  • 您的日期时间格式不标准。 R 可能需要一些帮助as.POSIXct("2016-05-05T16:46:21-04:00", format = "%Y-%m-%dT%H:%M:%S")

标签: r datetime time timestamp


【解决方案1】:

您可以使用as.POSIXcttz 参数来转换具有正确控制级别的时间戳。

如果时区都是 UTC-04:00 并且这是您的本地时区,您可以使用:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz=Sys.timezone())

如果它们都是 UTC-04:00 并且不是您当地的时区,但您知道确切的位置,那么您可以从 tz database 指定适当的时区:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="America/Port_of_Spain")

或者,您可以使用通用 GMT-4 时区:

dates = as.POSIXct(dates, format="%Y-%m-%dT%H:%M:%S", tz="Etc/GMT-4")

[编辑:感谢 Roland 在下面的评论。我最初使用strptime,它使用相同的语法,但返回一个POSIXlt 对象。]

【讨论】:

  • 你可以用同样的方式使用as.POSIXct。它为您提供了一个 POSIXct 对象,该对象通常比 POSIXlt 更可取,这就是 strptime 返回的内容-
  • 谢谢,我已经相应地修改了我的答案。
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 2023-04-09
  • 2015-10-10
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
相关资源
最近更新 更多