如何按指定日期区间拆分data.table中的行数据?
按指定日期拆分data.table数据
首先,你可以通过以下代码加载示例数据:
library(data.table) dt <- structure(list(name = c("2020-12-02 02_05_24.143926", "2020-12-02 04_05_44.370258", "2020-12-02 08_06_25.214121", "2020-12-02 10_06_45.697784", "2020-12-02 14_07_25.747003", "2020-12-02 16_07_46.002571", "2020-12-02 20_08_25.838364", "2020-12-02 22_08_45.705227", "2020-12-03 02_09_25.384941", "2020-12-03 04_09_44.709639", "2020-12-03 08_10_23.097440", "2020-12-03 10_10_42.111583", "2020-12-03 14_11_20.193122", "2020-12-03 16_11_39.252692", "2020-12-03 20_12_17.340138", "2020-12-03 22_12_36.086608", "2020-12-04 02_15_27.387402", "2020-12-04 04_15_46.375845", "2020-12-04 08_16_24.414194", "2020-12-04 10_16_43.215919", "2020-12-31 10_06_26.083394", "2020-12-31 10_36_30.720992", "2020-12-31 14_07_03.081910", "2020-12-31 14_37_07.718933", "2020-12-31 16_07_21.515981", "2020-12-31 16_37_26.054783", "2020-12-31 20_07_58.646942", "2020-12-31 20_38_03.155509", "2020-12-31 22_08_17.181192", "2020-12-31 22_38_21.847135", "2021-01-01 02_08_54.245043", "2021-01-01 02_38_58.905204", "2021-01-01 04_09_13.055522", "2021-01-01 04_39_17.797032", "2021-01-01 08_09_50.080337", "2021-01-01 08_39_54.646102", "2021-01-01 10_10_08.580802", "2021-01-01 10_40_13.262391", "2021-01-01 14_10_45.513987", "2021-01-01 14_40_50.152527", "2021-01-01 16_11_03.966316", "2021-01-01 16_41_08.595758", "2021-01-01 20_11_41.136895", "2021-01-01 20_41_45.807547", "2021-01-01 22_11_59.897654", "2021-01-01 22_42_04.619130", "2021-01-02 02_12_37.503054", "2021-01-02 02_42_42.155622", "2021-01-02 04_12_56.127958", "2021-01-02 04_43_00.807846", "2021-01-02 08_13_33.280704")), row.names = c(NA, -51L), class = c("data.table", "data.frame")) setDT(dt) # 确保数据为data.table格式
拆分方案
由于name字段的前10位是标准的YYYY-MM-DD格式字符串,其字典序与日期顺序完全一致,直接通过字符串前缀比较即可完成拆分,无需转换为日期类型:
# 2020-12-31之前的数据(不包含2020-12-31当天) dt_before_31 <- dt[substr(name, 1, 10) < "2020-12-31"] # 2020-12-31至2021-01-01之间的数据(包含两天的所有记录) dt_between <- dt[substr(name, 1, 10) %in% c("2020-12-31", "2021-01-01")] # 2021-01-01之后的数据(不包含2021-01-01当天) dt_after_01 <- dt[substr(name, 1, 10) > "2021-01-01"]
验证拆分结果
可以通过查看各子集的行数确认拆分是否正确:
nrow(dt_before_31) # 结果应为20 nrow(dt_between) # 结果应为30 nrow(dt_after_01) # 结果应为1
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

