r - 如何在 R 中将山区标准时间 (MST) 转换为山区夏令时间 (MDT)

标签 r datetime lubridate dst data-management

我正在尝试将 datetime 变量从 MST 转换为 MDT。

我想要获取的是一个新的datetime变量,它反射(reflect)了山地夏令时间(MDT)。

我不确定如何开始解决这个问题。

我正在考虑首先使用 MST 时区强制原始日期时间,然后将其转换为 MDT,但我不知道该怎么做。

更新:##############

经过一番挖掘,我发现原始的datetime源自UTC -07:00,这意味着它不反射(reflect)夏令时。但是,我们需要 datetime 遵循夏令时。

容易看到时间变化的数据:

df <- structure(list(datetime.char = c("2019-03-09 21:00", "2019-03-09 21:05", 
"2019-03-09 21:10", "2019-03-09 21:15", "2019-03-09 21:20", "2019-03-09 21:25", 
"2019-03-09 21:30", "2019-03-09 21:35", "2019-03-09 21:40", "2019-03-09 21:45", 
"2019-03-09 21:50", "2019-03-09 21:55", "2019-03-09 22:00", "2019-03-09 22:05", 
"2019-03-09 22:10", "2019-03-09 22:15", "2019-03-09 22:20", "2019-03-09 22:25", 
"2019-03-09 22:30", "2019-03-09 22:35", "2019-03-09 22:40", "2019-03-09 22:45", 
"2019-03-09 22:50", "2019-03-09 22:55", "2019-03-09 23:00", "2019-03-09 23:05", 
"2019-03-09 23:10", "2019-03-09 23:15", "2019-03-09 23:20", "2019-03-09 23:25", 
"2019-03-09 23:30", "2019-03-09 23:35", "2019-03-09 23:40", "2019-03-09 23:45", 
"2019-03-09 23:50", "2019-03-09 23:55", "2019-03-10 00:00", "2019-03-10 00:05", 
"2019-03-10 00:10", "2019-03-10 00:15", "2019-03-10 00:20", "2019-03-10 00:25", 
"2019-03-10 00:30", "2019-03-10 00:35", "2019-03-10 00:40", "2019-03-10 00:45", 
"2019-03-10 00:50", "2019-03-10 00:55", "2019-03-10 01:00", "2019-03-10 01:05", 
"2019-03-10 01:10", "2019-03-10 01:15", "2019-03-10 01:20", "2019-03-10 01:25", 
"2019-03-10 01:30", "2019-03-10 01:35", "2019-03-10 01:40", "2019-03-10 01:45", 
"2019-03-10 01:50", "2019-03-10 01:55", "2019-03-10 02:00", "2019-03-10 02:05", 
"2019-03-10 02:10", "2019-03-10 02:15", "2019-03-10 02:20", "2019-03-10 02:25", 
"2019-03-10 02:30", "2019-03-10 02:35", "2019-03-10 02:40", "2019-03-10 02:45", 
"2019-03-10 02:50", "2019-03-10 02:55", "2019-03-10 03:00", "2019-03-10 03:05", 
"2019-03-10 03:10", "2019-03-10 03:15", "2019-03-10 03:20", "2019-03-10 03:25", 
"2019-03-10 03:30", "2019-03-10 03:35", "2019-03-10 03:40", "2019-03-10 03:45", 
"2019-03-10 03:50", "2019-03-10 03:55", "2019-03-10 04:00")), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -85L), spec = structure(list(
    cols = list(datetime.char = structure(list(), class = c("collector_character", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), skip = 1), class = "col_spec"))

这是我们使用 @d.b 解决方案获得的结果的屏幕截图。然而,它并没有完全提供预期的输出。

screenshot of achieved vs. expected output

11 月份时钟更改

这是 11 月份的虚拟数据:

df <- structure(list(datetime.char = c("2017-11-04 21:00:00", "2017-11-04 21:05:00", 
"2017-11-04 21:10:00", "2017-11-04 21:15:00", "2017-11-04 21:20:00", 
"2017-11-04 21:25:00", "2017-11-04 21:30:00", "2017-11-04 21:35:00", 
"2017-11-04 21:40:00", "2017-11-04 21:45:00", "2017-11-04 21:50:00", 
"2017-11-04 21:55:00", "2017-11-04 22:00:00", "2017-11-04 22:05:00", 
"2017-11-04 22:10:00", "2017-11-04 22:15:00", "2017-11-04 22:20:00", 
"2017-11-04 22:25:00", "2017-11-04 22:30:00", "2017-11-04 22:35:00", 
"2017-11-04 22:40:00", "2017-11-04 22:45:00", "2017-11-04 22:50:00", 
"2017-11-04 22:55:00", "2017-11-04 23:00:00", "2017-11-04 23:05:00", 
"2017-11-04 23:10:00", "2017-11-04 23:15:00", "2017-11-04 23:20:00", 
"2017-11-04 23:25:00", "2017-11-04 23:30:00", "2017-11-04 23:35:00", 
"2017-11-04 23:40:00", "2017-11-04 23:45:00", "2017-11-04 23:50:00", 
"2017-11-04 23:55:00", "2017-11-05 00:00:00", "2017-11-05 00:05:00", 
"2017-11-05 00:10:00", "2017-11-05 00:15:00", "2017-11-05 00:20:00", 
"2017-11-05 00:25:00", "2017-11-05 00:30:00", "2017-11-05 00:35:00", 
"2017-11-05 00:40:00", "2017-11-05 00:45:00", "2017-11-05 00:50:00", 
"2017-11-05 00:55:00", "2017-11-05 01:00:00", "2017-11-05 01:00:00", 
"2017-11-05 01:05:00", "2017-11-05 01:05:00", "2017-11-05 01:10:00", 
"2017-11-05 01:10:00", "2017-11-05 01:15:00", "2017-11-05 01:15:00", 
"2017-11-05 01:20:00", "2017-11-05 01:20:00", "2017-11-05 01:25:00", 
"2017-11-05 01:25:00", "2017-11-05 01:30:00", "2017-11-05 01:30:00", 
"2017-11-05 01:35:00", "2017-11-05 01:35:00", "2017-11-05 01:40:00", 
"2017-11-05 01:40:00", "2017-11-05 01:45:00", "2017-11-05 01:45:00", 
"2017-11-05 01:50:00", "2017-11-05 01:50:00", "2017-11-05 01:55:00", 
"2017-11-05 01:55:00", "2017-11-05 02:00:00", "2017-11-05 02:05:00", 
"2017-11-05 02:10:00", "2017-11-05 02:15:00", "2017-11-05 02:20:00", 
"2017-11-05 02:25:00", "2017-11-05 02:30:00", "2017-11-05 02:35:00", 
"2017-11-05 02:40:00", "2017-11-05 02:45:00", "2017-11-05 02:50:00", 
"2017-11-05 02:55:00", "2017-11-05 03:00:00", "2017-11-05 03:05:00", 
"2017-11-05 03:10:00", "2017-11-05 03:15:00", "2017-11-05 03:20:00", 
"2017-11-05 03:25:00", "2017-11-05 03:30:00", "2017-11-05 03:35:00", 
"2017-11-05 03:40:00", "2017-11-05 03:45:00", "2017-11-05 03:50:00", 
"2017-11-05 03:55:00", "2017-11-05 04:00:00")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-97L))

有趣的是,当我进行 March 转换时,会出现一条明显的警告消息:12 个条目无法解析。

df <- df %>% 
  mutate(datetime = ymd_hms(df$datetime.char, tz = "MST7MDT"))

在最终结果中,如果我打印 df$date (请参阅注释中的 @d.b 代码),输出将保持 MST/MDT tz 并且在切换时可见:

[55] "2019-03-10 01:30:00 MST" "2019-03-10 01:35:00 MST" "2019-03-10 01:40:00 MST" "2019-03-10 01:45:00 MST" "2019-03-10 01:50:00 MST" "2019-03-10 01:55:00 MST"
[61] "2019-03-10 03:00:00 MDT" "2019-03-10 03:05:00 MDT" "2019-03-10 03:10:00 MDT" "2019-03-10 03:15:00 MDT" "2019-03-10 03:20:00 MDT" "2019-03-10 03:25:00 MDT"

这似乎不适用于 11 月转换

最佳答案

随时的选项

library(anytime)
anytime("2018-03-12 02:03:12", tz = "MST7MDT")

关于r - 如何在 R 中将山区标准时间 (MST) 转换为山区夏令时间 (MDT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58261709/

相关文章:

R 在 R 中使用引用时间表过滤数据

r - 以编程方式获取已加载包的函数 X 标题

r - 在 R 中,如何存储插图以便稍后使用 grid.arrange 进行排列?

R - R6 类作为严格的 "read-only"数据结构

c# - 更改迄今为止的天数

r - 如果 A 列 > B 列,如何将值从一列复制到新列?

r - 从数据帧生成时间序列列表

r - 如何使用自由刻度但在ggplot中保留固定引用点?

MySQL 用最快的时间获得最高分

python - 将纪元时间转换为 Pandas 数据框中的格式化日期字符串