在R中使用read_parquet读取Parquet文件时能否指定时区?
问题:读取Parquet文件时指定时区(R语言arrow包)
我尝试将包含EST时间戳列的Parquet文件读取到R中,使用arrow包的read_parquet函数时,它默认将时间戳视为UTC时区。请问是否可以在读取文件时指定时区?
示例代码如下:
library(arrow) library(lubridate) write_dataset(data.frame(timestep = seq(ymd_h("2023010112"), ymd_h("2023010212"), by = "hours")), "~/timeseriesexample", format="parquet") d <- read_parquet("timeseriesexample/part-0.parquet") tz(d[1,1]) # "UTC"
我可以使用force_tz函数在读取后修正时区,但更希望在读取时就直接设置正确的时区:
tz(force_tz(d[1,1], "America/New_York")) # "America/New_York"
此次我使用的是AWS上的外部数据,例如:
s3://oedi-data-lake/nrel-pds-building-stock/end-use-load-profiles-for-us-building-stock/2022/resstock_amy2018_release_1/timeseries_individual_buildings/by_state/upgrade=0/state=AL/100066-0.parquet
解答
目前arrow包的read_parquet函数不支持在读取时直接指定时区。原因在于Parquet格式的时间戳类型本身默认不带时区元数据(仅少数自定义写入的数据集会存储时区信息),arrow读取这类数据时会默认解析为UTC时区的POSIXct对象。
针对外部数据集,推荐两种可行的处理方式:
1. 读取后批量修正时区
直接对时间戳列进行批量时区转换,操作简单直观:
library(arrow) library(lubridate) # 读取目标Parquet文件 d <- read_parquet("s3://oedi-data-lake/nrel-pds-building-stock/end-use-load-profiles-for-us-building-stock/2022/resstock_amy2018_release_1/timeseries_individual_buildings/by_state/upgrade=0/state=AL/100066-0.parquet") # 为整列时间戳设置正确时区 d$timestep <- force_tz(d$timestep, tzone = "America/New_York") # 验证时区 tz(d$timestep[1]) # 输出:"America/New_York"
2. 结合数据集API在加载流程中转换(适合大数据集)
如果处理的是大型数据集,可使用arrow的open_dataset配合mutate,在数据加载的流程中整合时区转换操作,效率更高:
library(arrow) library(lubridate) # 打开数据集并实时转换时区,最后加载到内存 ds <- open_dataset("s3://oedi-data-lake/nrel-pds-building-stock/end-use-load-profiles-for-us-building-stock/2022/resstock_amy2018_release_1/timeseries_individual_buildings/by_state/upgrade=0/state=AL/") %>% mutate(timestep = force_tz(timestep, "America/New_York")) %>% collect() # 验证时区 tz(ds$timestep[1]) # 输出:"America/New_York"
补充说明:如果是自行生成Parquet文件,可在写入时通过write_parquet的timezone参数指定时区,这样读取时会自动保留时区信息;但对于无法控制写入过程的外部数据集,只能通过上述读取后转换的方式处理。
内容的提问来源于stack exchange,提问作者Margaret
相关产品推荐
相关产品推荐

