【问题标题】:Change timezone without changing the actual time更改时区而不更改实际时间
【发布时间】:2017-08-02 20:20:06
【问题描述】:

我和https://stackoverflow.com/questions/15575713/modifying-timezone-of-a-posixct-object-without-changing-the-display有同样的问题。但是,我遵循了接受的响应,但没有得到想要的结果。

dt 是一个字符串 ("2017-07-07 15.46.00")。我需要将其更改为带有 CDT 时区 ("2017-07-07 15:46:00 CDT") 的数据时间格式。我可以通过lubridate::ymd_hms 做到这一点,我得到了我想要的结果(lub.dt:“2017-07-07 15:46:00 CDT”),但是对于我的数据集大小来说太慢了。我使用fasttime::fastPOSIXct 转换了 dt,这非常快,但该函数假定输入为“GMT”。所以我也使用“GMT”作为输出来获得相同的日期时间显示(fast.dt:"2017-07-07 15:46:00 GMT")。最后,我尝试通过 as.POSIXct 更改时区。我使用相同的 tz(美国/芝加哥)作为来源和函数,但我得到的结果是“2017-07-07 16:46:00 CDT”,即(时间 +1)。

library(lubridate)
library(fasttime)
dt <- "2017-07-07 15.46.00"
lub.dt <- ymd_hms(dt, tz = 'America/Chicago')
fast.dt <- fastPOSIXct(dt, tz = 'GMT')
fast.dt.new.tz <- as.POSIXct(x = as.numeric(fast.dt), origin = as.POSIXct("1970-01-01", tz = 'America/Chicago'),tz = 'America/Chicago')

谁能指导我做错了什么?

【问题讨论】:

  • 试试这个:as.POSIXct(dt,"%Y-%m-%d %H.%M.%S", tz = 'CST6CDT')。 CST6CDT 应提供正确的 CST 或 CDT 时区。
  • 感谢您的建议。 'as.POSIXct' 比 'lubridate' 函数快,但它不适用于我的数据集。这个post 比较了不同的解析方法。

标签: r timezone posixct


【解决方案1】:

这很混乱。你的问题是坚持(非常好的)fasttime 包,现在试图捏造 TZ 调整。

我建议反对。您可以随时使用,速度也很快(编译后的代码,但尝试不同的格式):

R> anytime::anytime("2017-07-07 15.46.00")
[1] "2017-07-07 15:46:00 CDT"
R> 

它的优点是它可以做到在这里想要的:将字符串解释为本地时间,并设置本地时间(芝加哥对我来说也是)。

【讨论】:

  • 感谢 Dirk 介绍这个包。但是,我只是检查了它的性能。它似乎比“fastPOSIXct”和“as.POSIXct”都慢。 '库(微基准)dt
  • 当然。而且更一般。有取舍。但它在这里回答了你的问题
  • 实际上它并没有回答这个问题。在大数据集上使用 anytime 是不切实际的。如果您能帮助完成最后一次操作(更改时区),我将不胜感激。
  • 我不敢苟同,但如果它不适合您,幸运的是,仍然有开源的退款保证。我有另一个改变时区的包,但考虑到你的态度,我并没有完全有动力去扩展它。祝你好运。
  • 我很愿意尝试新的功能/方法。但我谈到了数字,anytime 做同样的工作比fastPOSIX 慢了大约 72 (55940/776) 倍。我不偏向于使用函数,但我通常通过数字来比较性能。
猜你喜欢
  • 2011-02-21
  • 2013-05-24
  • 2019-04-11
  • 2016-01-12
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
相关资源
最近更新 更多