You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在循环中使用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)))
}

解决方法

问题源于两个细节:

  1. 时区字符串兼容性:EST是缩写,部分系统无法正确识别,建议使用完整时区标识符(如America/New_York,自动适配夏令时,比固定EST更准确)。
  2. 文件路径缺失: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:33:22