更正日期时间并以 UTC+1 为偏移量

问题描述 投票:0回答:1

这个问题可能是基于我对日期时间如何工作的无知,但我在某些记录器数据的时区转换方面遇到了困难。我有多个记录器,它们在多个时间点被读取。意外的是,时区设置有时会在读取期间发生更改,因此某些记录器的某些时间段以 GMT+1 记录,而某些时间段以 GMT+2 记录(但时间恒定,没有切换夏令时或类似时间)。我希望它们都处于 UTC+1(即 GMT+1),以便它们具有可比性。我创建了一个数据帧,其中包含整个时间段(date_time,目前为字符串)内所有记录器(loggerID)的所有测量值(温度)。我添加了一列,指定记录每个测量值的时区(时区,“GMT+1”或“GMT+2”)。我的第一次尝试是创建一个 POSIXct date_time 并有条件地告诉函数使用 GMT+1 或 GMT+2:

dat_temp <- dat_temp %>%
  mutate(date_time_set = if_else(timezone == "GMT+1", as.POSIXct(date_time, format = "%Y-%m-%d %H:%M:%S", tz = "GMT+1"), as.POSIXct(date_time, format = "%Y-%m-%d %H:%M:%S", tz = "GMT+2")))

我发现这不起作用,因为时区必须指定为地点(例如“欧洲/巴黎”)或简单地“UTC”或“GMT”,但没有抵消。我无法指定欧洲的某个地方,因为这会假设记录器将时间切换为夏令时,对吧?我尝试使用 lubridate 进行相同的操作,但出现同样的问题:

dat_temp <- dat_temp %>%
  mutate(date_time_set = if_else(timezone == "GMT+1", ymd_hms(dat_temp$date_time, tz = "GMT+1"), ymd_hms(dat_temp$date_time, tz = "GMT+2")))

然后我虽然可以将时间指定为 UTC(这基本上是错误的),然后手动从 GMT+2 数据中减去 1 小时,然后将所有内容设置为 UTC+1(尽管它会保存为 UTC,这仍然是错误的,因为现在是 UTC+1):

dat_temp <- dat_temp %>%
  mutate(date_time_posix = as.POSIXct(date_time, format = "%Y-%m-%d %H:%M:%S", tz = "UTC"), # assumes UTC for everything if not specified otherwise
         date_time_corr = if_else(timezone == "GMT+2", date_time_posix - (1*60*60), date_time_posix)) # manually subtract 1h for GMT+2 data

我也玩过 lubridate 的

with_tz()
force_tz()
,但无济于事。所以我的问题是:

  1. 是否有某种方法或功能可以指定带有偏移量的时区(GMT+1或UTC+2或类似),而不是自动执行夏令时的地方?
  2. 如果没有,有没有办法手动将我的所有记录器数据设置为 UTC+1,然后以某种方式将其保存为没有时区的日期时间,以便人们在地球上其他地方打开数据时不会意外地弄乱时区和数据?

数据子集:

> dput(dat_temp)
structure(list(date_time = c("2021-07-01 00:00:00", "2021-07-01 00:30:00", 
"2021-07-01 01:00:00", "2021-07-01 01:30:00", "2021-07-01 02:00:00", 
"2021-07-01 02:30:00", "2021-07-01 03:00:00", "2021-07-01 03:30:00", 
"2021-07-01 04:00:00", "2021-07-01 04:30:00", "2021-10-16 02:30:00", 
"2021-10-16 03:00:00", "2021-10-16 03:30:00", "2021-10-16 04:00:00", 
"2021-10-16 04:30:00", "2021-10-16 05:00:00", "2021-10-16 05:30:00", 
"2021-10-16 06:00:00", "2021-10-16 06:30:00", "2021-10-16 07:00:00", 
"2021-10-16 07:30:00", "2021-11-03 00:00:00", "2021-11-03 00:30:00", 
"2021-11-03 01:00:00", "2021-11-03 01:30:00", "2021-11-03 02:00:00", 
"2021-11-03 02:30:00", "2021-11-03 03:00:00", "2021-11-03 03:30:00", 
"2021-11-03 04:00:00", "2021-11-03 04:30:00", "2021-11-03 05:00:00", 
"2021-11-19 11:00:00", "2021-11-19 11:30:00", "2021-11-19 12:00:00", 
"2021-11-19 12:30:00", "2021-11-19 13:00:00", "2021-11-19 13:30:00", 
"2021-11-19 14:00:00", "2021-11-19 14:30:00", "2021-11-19 15:00:00", 
"2021-11-19 15:30:00", "2021-11-19 16:00:00"), temp = c(16.427, 
16.141, 15.951, 15.569, 15.282, 14.996, 14.9, 14.709, 14.517, 
14.421, 4.727, 4.623, 4.519, 4.415, 4.311, 4.207, 4.102, 3.998, 
3.893, 3.788, 3.683, 2.73, 2.624, 2.624, 2.624, 2.517, 2.517, 
2.517, 2.517, 2.624, 2.73, 2.837, 0.674, 0.674, 0.784, 1.112, 
1.872, 2.517, 2.943, 3.155, 3.155, 3.049, 2.73), loggerID = c("logger1", 
"logger1", "logger1", "logger1", "logger1", "logger1", "logger1", 
"logger1", "logger1", "logger1", "logger2", "logger2", "logger2", 
"logger2", "logger2", "logger2", "logger2", "logger2", "logger2", 
"logger2", "logger2", "logger1", "logger1", "logger1", "logger1", 
"logger1", "logger1", "logger1", "logger1", "logger1", "logger1", 
"logger1", "logger3", "logger3", "logger3", "logger3", "logger3", 
"logger3", "logger3", "logger3", "logger3", "logger3", "logger3"
), timezone = c("GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", 
"GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", 
"GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", "GMT+2", 
"GMT+2", "GMT+2", "GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", 
"GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", 
"GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", "GMT+1", 
"GMT+1", "GMT+1", "GMT+1")), row.names = c(1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 142902L, 142903L, 142904L, 142905L, 142906L, 
142907L, 142908L, 142909L, 142910L, 142911L, 142912L, 196225L, 
196226L, 196227L, 196228L, 196229L, 196230L, 196231L, 196232L, 
196233L, 196234L, 196235L, 533387L, 533388L, 533389L, 533390L, 
533391L, 533392L, 533393L, 533394L, 533395L, 533396L, 533397L
), class = "data.frame")
r datetime lubridate posixct
1个回答
0
投票

大多数平台支持“u2060Etc/GMT+nu2060”和“u2060Etc/GMT-nu2060”形式的时区(也可能没有前缀“u2060Etc/u2060”),假定与 UTC 的固定偏移(因此无夏令时)。与某些预期相反(但与“u2060PST8PDTu2060”等名称一致),负偏移量是早于 UTC(东)的时间,正偏移量是晚于 UTC(西)的时间。

library(lubridate)

mydate <- as.POSIXct('2024-01-01',tz='Etc/GMT+2')
with_tz(mydate,'UTC')
#> [1] "2024-01-01 02:00:00 UTC"
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.