在一个数据框列中使用多个时区

Using multiple timezones in one dataframe column

我有一个由 8 个不同数据集组成的大型数据框,下面是三个具有不同时区的样本。我导入数据,然后将 8 个数据帧绑定到一个 df 中。 我希望能够 运行 分析和 ggplot 整个数据集或它的部分保持每个区域的 Date_time 时区正确。

我最近发现 R 中的数据帧显然不支持一列中的多个时区,因此使用 rbind 添加的所有后续 df 都采用第一个数据的时区(df$Date_time 从导入值更改), 我尝试了不同的方法来解决这个问题:

  1. 将数据帧保存为列表,并创建 8 个列表的列表可使 listx$Date_time 中的本地时区保持正确,但 ggplot 不允许从列表中绘图,当我转换回数据帧时,时区再次更改。

  2. 我创建了 df$tz 列以在文件中包含每个时区,我试过这个: 来创建一个固定的 UTC 时间,但这是一个字符串 df$UTC 和我不确定如何让 R 和 ggplot 使用正确的时区信息绘制数据。

df$Date 在不同时区保持正确,因为时间被剥离,df$time_ser 在日期被剥离时保持正确。

我是否需要在每次分析中包含一个函数来计算实际本地时间 运行s - 非常耗时,或者是否有其他方法可以做到这一点。

具有三个时区的示例数据框 'df':

> df
             Date_time Depth       Date time_ser                     UTC               tz
1  2013-10-14 12:30:00 64.45 2013-10-14 12:30:00 2013-10-14 03:30:00 UTC       Asia/Tokyo
2  2013-10-14 12:30:05 65.95 2013-10-14 12:30:05 2013-10-14 03:30:05 UTC       Asia/Tokyo
3  2013-10-14 12:30:10 65.95 2013-10-14 12:30:10 2013-10-14 03:30:10 UTC       Asia/Tokyo
4  2013-10-14 12:30:15 66.45 2013-10-14 12:30:15 2013-10-14 03:30:15 UTC       Asia/Tokyo
5  2013-10-14 12:30:20 67.95 2013-10-14 12:30:20 2013-10-14 03:30:20 UTC       Asia/Tokyo
6  2013-10-14 12:30:25 66.95 2013-10-14 12:30:25 2013-10-14 03:30:25 UTC       Asia/Tokyo
31 2018-05-09 04:11:39  0.00 2018-05-08 14:11:39 2018-05-08 19:11:39 UTC     America/Lima
32 2018-05-09 04:11:42  0.00 2018-05-08 14:11:42 2018-05-08 19:11:42 UTC     America/Lima
33 2018-05-09 04:11:45  0.00 2018-05-08 14:11:45 2018-05-08 19:11:45 UTC     America/Lima
34 2018-05-09 04:11:48  0.00 2018-05-08 14:11:48 2018-05-08 19:11:48 UTC     America/Lima
35 2018-05-09 04:11:51  0.00 2018-05-08 14:11:51 2018-05-08 19:11:51 UTC     America/Lima
36 2018-05-09 04:11:54  0.00 2018-05-08 14:11:54 2018-05-08 19:11:54 UTC     America/Lima
43 2019-03-06 13:52:40  0.50 2019-03-06 17:52:40 2019-03-06 04:52:40 UTC Pacific/Auckland
44 2019-03-06 13:52:50  3.50 2019-03-06 17:52:50 2019-03-06 04:52:50 UTC Pacific/Auckland
45 2019-03-06 13:53:00  6.50 2019-03-06 17:53:00 2019-03-06 04:53:00 UTC Pacific/Auckland
46 2019-03-06 13:53:10  9.00 2019-03-06 17:53:10 2019-03-06 04:53:10 UTC Pacific/Auckland
47 2019-03-06 13:53:20  9.50 2019-03-06 17:53:20 2019-03-06 04:53:20 UTC Pacific/Auckland
48 2019-03-06 13:53:30 12.00 2019-03-06 17:53:30 2019-03-06 04:53:30 UTC Pacific/Auckland

I want to be able to run analysis and ggplot the whole dataset or sections of it keeping the Date_time timezone correct to each area.

我将其解释为“我想在当地时间绘制所有数据”,即我希望奥克兰的上午 11 点相当于 Lima/Tokyo 的上午 11 点。

实现此目的的一种方法是使用 lubridate::force_tz 函数,它可以在不调整“时间”组件的情况下更改 POSIXct 对象的时区。

> t = as.POSIXct('2013-10-14 12:30:00', tz = 'Asia/Tokyo')

> t
[1] "2013-10-14 12:30:00 JST"

> lubridate::force_tz(t, 'UTC')
[1] "2013-10-14 12:30:00 UTC"

如果您在合并所有原始数据帧之前执行此操作,那么您可以假设所有数据都在同一时区,并且东京的上午 11 点与利马的上午 11 点相同。

当然,您可能希望保留实时时区的记录,以防您想要将它们转换回来!