Это мерзко. Я не могу объяснить, почему аргумент tz
не работает так, как вы его пробовали. Я бы так поступил. После небольших экспериментов я обнаружил, что замена
df$date <- as.Date(df$datetime)
на
df$date <- with_tz(date(df$datetime), tz="US/Pacific")
дает желаемый результат:
tz(df$date)
[1] "US/Pacific"
[df$date <- with_tz(as.Date(df$datetime), tz="US/Pacific")
также работает.]
@ heds1: force_tz
у меня не работает, как и для OP. Выбранный результат sessionInfo()
:
R version 3.6.3 (2020-02-29)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Mojave 10.14.6
lubridate_1.7.4
Обновление
Никто не дал достаточно ясных ответов в своих комментариях, чтобы быть уверенным точно какой код выполняется для получения каждого набора результатов. Но я думаю, что у меня может быть источник путаницы: это df$date <- force_tz(df$date, tz="US/Pacific")
.
Из онлайн do c для force_tz
: «force_tz
возвращает дату- время, которое имеет то же время, что и время ввода, но в новом часовом поясе ", тогда как то же предложение для with_tz
читает" with_tz
возвращает дату и время, как это было бы в другом часовой пояс ».
Разница небольшая, но важная: force_tz
просто заменяет значение поля часового пояса, оставляя время на часах неизменным, тогда как with_tz
отображает время часов на соответствующее время часов в новый часовой пояс в тот же момент.
Немного переработан код OP для ясности:
# create a short datetime sequence
df <- data.frame(utc_datetime = seq(ymd_hm("2020-1-1 0:00"), ymd_hm("2020-1-3 12:00"), by = "hour"))
# check the timezone -- it is UTC
tz(df$utc_datetime)
[1] "UTC"
# convert to PST
df$pst_datetime <- with_tz(df$utc_datetime, tz="US/Pacific")
# confirm -- OK
tz(df$pst_datetime) # [1] "US/Pacific"
[1] "US/Pacific"
# Convert UTC datetime to Date
df$utc_date <- with_tz(date(df$utc_datetime))
tz(df$utc_date)
[1] "UTC"
# Convert PST datetime to Date
df$pst_date <- with_tz(date(df$pst_datetime), tz="US/Pacific")
tz(df$pst_date)
[1] "US/Pacific"
# List to show behaviour around midnight for both UTC and PST
df[22:35,]
utc_datetime pst_datetime utc_date pst_date
22 2020-01-01 21:00:00 2020-01-01 13:00:00 2020-01-01 2020-01-01
23 2020-01-01 22:00:00 2020-01-01 14:00:00 2020-01-01 2020-01-01
24 2020-01-01 23:00:00 2020-01-01 15:00:00 2020-01-01 2020-01-01
25 2020-01-02 00:00:00 2020-01-01 16:00:00 2020-01-02 2020-01-01
26 2020-01-02 01:00:00 2020-01-01 17:00:00 2020-01-02 2020-01-01
27 2020-01-02 02:00:00 2020-01-01 18:00:00 2020-01-02 2020-01-01
28 2020-01-02 03:00:00 2020-01-01 19:00:00 2020-01-02 2020-01-01
29 2020-01-02 04:00:00 2020-01-01 20:00:00 2020-01-02 2020-01-01
30 2020-01-02 05:00:00 2020-01-01 21:00:00 2020-01-02 2020-01-01
31 2020-01-02 06:00:00 2020-01-01 22:00:00 2020-01-02 2020-01-01
32 2020-01-02 07:00:00 2020-01-01 23:00:00 2020-01-02 2020-01-01
33 2020-01-02 08:00:00 2020-01-02 00:00:00 2020-01-02 2020-01-02
34 2020-01-02 09:00:00 2020-01-02 01:00:00 2020-01-02 2020-01-02
35 2020-01-02 10:00:00 2020-01-02 02:00:00 2020-01-02 2020-01-02