如何在循环内更改 lubridate 中 dt 变量的时区?

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

我正在处理自纪元以来以秒为单位表示的时间数据。我有单独的 Excel 文件,并且希望将时间格式设置为 M-D-Y H:M:S。我尝试编写一个循环来为每个文件创建一个新的 dt 变量,然后将提取的时间更改为 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)))


}

代码将获取每个 Excel 文件,创建新变量并写入新文件,但时间不是以 EST 表示,而是保留为 UTC。

但是,我可以在操作单个数据帧时在 EST 中创建 dt 变量(如下)。

sample_2 |>
  mutate(dt = as_datetime(time1),
         dt_adj = with_tz(dt, tzone = "EST"))

上面的代码返回新列,但不会更改时区,除非我单独编辑每个数据帧。有解决方法吗,还是每个文件都需要单独编辑?

r for-loop lubridate
1个回答
0
投票
dt_adj = with_tz(dt, tzone = "EST") |> force_tz("UTC")
据我所知,Excel 没有时区,而 R 日期时间以 UTC 格式保存,但具有时区属性。因此,当您更改时区并写入 Excel 时,唯一有效的是原始时间,而不是更改后的时区。因此,您可以添加第二个步骤,使其成为 UTC 时间,其标称外观与您的 EST 时间相同。

© www.soinside.com 2019 - 2024. All rights reserved.