【发布时间】:2021-03-11 06:10:16
【问题描述】:
我的脚本中有一个 data.table 对象,我需要将单独的日期和时间列转换为 POSIXct 对象。我正在使用fastPOSIXct() 转换为POSIXct。我发现data.table 操作存在一些瓶颈来执行此操作。主要问题是在转换为POSIXct 和POSIXct 转换本身之前连接字符串。我正在使用stri_c() 更快地执行paste0()。有没有办法并行化这个计算来加快它?正在读取的 csv 文件是一个大约 2gb 的大文件。
index = match(file, csv_files)
print(paste0("Starting File #", index, ". Running Active Future Filter."))
csv1 = fread(file = file)
# create row for date in Date format
csv1[, date := as.Date(integer())]
csv1[, trade_date := as.character(trade_date)]
csv1[, date := as.Date(trade_date[1], "%Y%m%d"), by = trade_date]
csv1[, active_exp := character()]
csv1[, active_exp := get.active.future(date = date[1]), by = date]
nrow(csv1)
csv1 = csv1[csv1$active_exp == as.character(csv1$contract_delivery_date),]
# Add POSIXct
# keep only essential columns
csv1 = csv1[,-c(3, 6, 9, 23, 11:21)]
print(paste0("Running POSIX"))
# establish date-time POSIX for tick
csv1[, date_time_char := as.character()]
# creates date time character type to be converted to POSIXct
csv1[, date_time_char := stri_c(date[1], trade_time[1], sep = " "), by = list(date, trade_time)]
# convert date time character type to POSIXct
csv1[, date_time := fastPOSIXct(date_time_char[1]), by = date_time_char]
# time shift for date when time is between 17:00 and 00:00
print("Making time adjustment")
csv1[,adj_date_time := time.shift(date_time[1]), by = date_time]
# convert date
csv1[, date := as.Date(adj_date_time, tz = "UTC")]
# overwrite current loaded file
【问题讨论】:
-
欢迎您!请使您的示例可重现。另外,关于这个问题,我不确定这是“data.table 操作的一些瓶颈”,因为它从字符串转换为
POSIXct很慢。 -
@Cole 为无法包含数据而道歉,它是付费的,不能在公共论坛上发布。我可以发送 str() 或任何其他信息。
-
可复制并不意味着共享私人数据。这意味着花时间提供可以模拟问题的数据集。
-
@chinsoon12 我也有同样的想法,但我认为这可能是一个性能问题。如果您有很多重复的日期,那么按字符串分组然后对一个字符串而不是所有字符串进行转换可能会更快。
标签: r data.table large-data posixct