如何在 R 中将日期和时间从 UTC 转换为本地时间?

How to convert date and time from UTC to local time in R?

我有一个如下所示的数据框 (vlinder),其中日期和时间戳(UTC 格式)位于不同的列中:

date      time.utc variable  
1/04/2020 0:00:00  12  
1/04/2020 0:05:00  54 

第一步,我使用以下代码将 datetime 变量合并到一个名为 dateandtime 的列中:

vlinder$dateandtime <- paste(vlinder$date, vlinder$time.utc)

这导致数据框中多了一列 vlinder:

date      time.utc variable  dateandtime
1/04/2020 0:00:00  12        1/04/2020 0:00:00
1/04/2020 0:05:00  54        1/04/2020 0:05:00

我想将 UTC 时间转换成本地时间(是 CEST,所以时差为 2 小时)。

我尝试使用以下代码,但得到的结果完全不同。

vlinder$dateandtime <- as.POSIXct(vlinder$dateandtime, tz = "UTC")
vlinder$dateandtime.cest <- format(vlinder$dateandtime, tz = "Europe/Brussels", usetz = TRUE) 

这导致:

date         time.utc variable   dateandtime   dateandtime.cest
1/04/2020    0:00:00  12         0001-04-20    0001-04-20 00:17:30 LMT
1/04/2020    0:05:00  54         0001-04-20    0001-04-20 00:17:30 LMT

我该如何解决这个问题? 非常感谢!

as.POSIXct 的默认格式需要按 Year-Month-Day 排序的日期。因此日期 01/04/2020 被翻译成第 1 年的 4 月 20 日。

您只需将时间格式添加到 as.POSIXct:

vlinder$dateandtime <- as.POSIXct(vlinder$dateandtime, tz = "UTC", format = "%d/%m/%Y %H:%M:%S")

format(vlinder$dateandtime, tz = "Europe/Brussels", usetz = TRUE) 

这是 lubridatetidyverse 的答案。一些数据整理,数据类型更改,然后 bam。检查 lubridate::OlsonNames() 的有效时区 (tz)。 (我不确定我选择了正确的 tz。)

library(tidyverse)
library(lubridate)

df <- read.table(header = TRUE, 
                 text = "date      time.utc variable 
                        1/04/2020 00:00:00  12  
                        1/04/2020 00:05:00  54")


df <- df %>%
  mutate(date = mdy(date),
         datetime_utc = as_datetime(paste(date, time.utc)),
         datetime_cest = as_datetime(datetime_utc, tz = 'Europe/Brussels'))
        date time.utc variable        datetime_utc       datetime_cest
1 2020-01-04 00:00:00       12 2020-01-04 00:00:00 2020-01-04 01:00:00
2 2020-01-04 00:05:00       54 2020-01-04 00:05:00 2020-01-04 01:05:00