РЕДАКТИРОВАТЬ: Как было предложено @Cole, я использовал эту функцию С++, а также IDate и ITime, чтобы ускорить это. Я не проверял это, но могу сказать, что он работает примерно в 20 раз быстрее, чем предыдущий код. Код ниже.
for(file in csv_files){
index = match(file, csv_files)
csv1 = fread(file = file, drop = c(3, 6, 9, 23, 11:21))
options(warn = -1)
# get date and time and classify as POSIXct
csv1[,
c("date_time", "date", "time") := {
time = as.ITime(to_time(trade_time))
date1 = as.IDate(as.character(trade_date), "%Y%m%d")
if(hour(time) >= 17){
POSIX = as.POSIXct(date1, time, tz = "UTC") - days(1)
.(POSIX, as.Date(POSIX), time)
}else{
POSIX = as.POSIXct(date1, time, tz = "UTC")
.(POSIX, as.Date(POSIX), time)
}
}]
options(warn = 0)
# covert trade date to character format
csv1[, trade_date := as.character(trade_date)]
# run active_exp
csv1[,
active_exp := get.active.future(as.Date(date[1])),
by = date]
# filter only active future
csv1 = csv1[active_exp == as.character(contract_delivery_date)]
# write file
file_path = paste0("C:/Users/ocean/Documents/CME Data/Active Daily Data CSVs/", index, ".csv")
fwrite(csv1, file = file_path)
print(paste0("Progress = ", round(index/length(csv_files), 3)*100, "%"))
}
СТАРЫЙ: Я использовал код, предоставленный @Cole, но все еще запускал его довольно долгое время. Я немного отредактировал код, чтобы исправить синтаксис, как показано ниже. файл = csv_files[1] index = match(файл, csv_files)
csv1 = fread(file = file, drop = c(3, 6, 9, 23, 11:21))
# create row for date in Date format
csv1[, trade_date := as.character(trade_date)]
csv1[,
c("date", "active_exp") := {
date1 = as.Date(.BY[[1L]], "%Y%m%d")
active_exp = get.active.future(date1)
.(date1, active_exp)},
by = trade_date]
csv1 = csv1[active_exp == contract_delivery_date]
# creates date time character type to be converted to POSIXct
csv1[,
c("date_time", "adj_date_time", "date") := {
date_time = fastPOSIXct(stri_c(.BY[[1L]], .BY[[2L]], sep = " "))
adj_date_time = time.shift(date_time)
date = as.Date(adj_date_time, tz = "UTC")
}
, by = .(date, trade_time)
]
Чтобы попытаться предложить воспроизводимый пример, dput()
данных приведены ниже.
structure(list(trade_date = c(20200115L, 20200115L, 20200115L,
20200115L, 20200115L, 20200115L), trade_time = c("17:00:00",
"17:00:00", "17:00:00", "17:00:00", "17:00:00", "17:00:00"),
trade_sequence_number = c(9028350L, 9028357L, 9028366L, 9028394L,
9028397L, 9028400L), session_indicator = c("E", "E", "E",
"E", "E", "E"), ticker_symbol = c("ES", "ES", "ES", "ES",
"ES", "ES"), future_option_index_indicator = c("F", "F",
"F", "F", "F", "F"), contract_delivery_date = c(2003L, 2003L,
2003L, 2003L, 2003L, 2003L), trade_quantity = c(176L, 0L,
3L, 2L, 4L, 10L), strike_price = c(0L, 0L, 0L, 0L, 0L, 0L
), trade_price = c(3287.75, 3287.75, 3288, 3288, 3288, 3288
), ask_bid_type = c(NA, NA, NA, NA, NA, NA), indicative_quote_type = c(NA,
NA, NA, NA, NA, NA), market_quote = c(NA, NA, NA, NA, NA,
NA), close_open_type = c("", "O", "", "", "", ""), valid_open_exception = c(NA,
NA, NA, NA, NA, NA), post_close = c(NA, NA, NA, NA, NA, NA
), cancel_code_type = c(NA, NA, NA, NA, NA, NA), insert_code_type = c(NA,
NA, NA, NA, NA, NA), fast_late_indicator = c(NA, NA, NA,
NA, NA, NA), cabinet_indicator = c(NA, NA, NA, NA, NA, NA
), book_indicator = c(NA, NA, NA, NA, NA, NA), entry_date = c(20200114L,
20200114L, 20200114L, 20200114L, 20200114L, 20200114L), exchange_code = c("XCME",
"XCME", "XCME", "XCME", "XCME", "XCME")), row.names = c(NA,
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x000001ef853c1ef0>)
Учитывая размер файла (2-4 ГБ для 38 файлов), мне просто нужно изучить С++ или позволить этому работать всю ночь?
person
Pceam
schedule
29.11.2020
POSIXct
происходит медленно. - person Cole   schedule 29.11.2020by
при вставке и использованииfastPOSIXct
? - person chinsoon12   schedule 30.11.2020