如何在循环中使用lubridate修改dt变量的时区?
问题
处理多个Excel文件中的纪元秒时间数据,想要统一格式化为M-D-Y H:M:S并转换为EST时区。单独处理单个数据框时能成功生成EST时区的时间变量,但用循环批量处理时,转换后的时间仍为UTC时区,未正确切换到EST。
单独处理的可行代码:
sample_2 |> mutate(dt = as_datetime(time1), dt_adj = with_tz(dt, tzone = "EST"))
附可复现代码:
library(tidyverse) library(readxl) library(writexl) time1 <- as.vector(c(1721138400, 1721142000, 1721145600, 1721149200, 1721152800, 1721156400, 1721160000, 1721163600)) time2 <- as.vector(c(1721167200, 1721170800, 1721174400, 1721178000, 1721181600, 1721185200, 1721188800, 1721192400)) sample_1 <- as.data.frame(time1) sample_2 <- as.data.frame(time2) |> rename(time1 = time2) write_xlsx(sample_1, "sample_1.xlsx") write_xlsx(sample_2, "sample_2.xlsx") files <- list.files(path = "F:/Documents/mydata", pattern = "sample") wd <- "F:/Documents/mydata" for (file in files) { the_data <- read_excel(file) |> mutate(dt = as_datetime(time1), dt_adj = with_tz(dt, tzone = "EST")) write_xlsx(the_data, path = paste0(wd, "/", basename(file))) }
解决方法
问题源于两个细节:
- 时区字符串兼容性:
EST是缩写,部分系统无法正确识别,建议使用完整时区标识符(如America/New_York,自动适配夏令时,比固定EST更准确)。 - 文件路径缺失:
list.files默认返回文件名而非完整路径,若当前工作目录不是目标文件夹,read_excel会找不到文件。
修正后的循环代码:
library(tidyverse) library(readxl) library(writexl) wd <- "F:/Documents/mydata" # 获取带完整路径的文件列表 files <- list.files(path = wd, pattern = "sample", full.names = TRUE) for (file in files) { the_data <- read_excel(file) |> mutate( dt = as_datetime(time1), # 使用标准时区标识符 dt_adj = with_tz(dt, tzone = "America/New_York") ) # 直接写入原文件路径 write_xlsx(the_data, path = file) }
额外说明
- 若不需要夏令时切换,可使用
Etc/GMT+5(EST比UTC晚5小时),但America/New_York更贴合实际时区规则。 - 验证转换结果可在循环中加入
print(unique(tz(the_data$dt_adj))),查看实际时区是否正确。
内容的提问来源于stack exchange,提问作者John Lawrence
相关产品推荐
相关产品推荐

