【问题标题】:Write rows with certain dates only using Fread in data.table package r仅在 data.table 包 r 中使用 Fread 写入具有特定日期的行
【发布时间】:2015-01-06 09:42:21
【问题描述】:

我想要做的是在特定日期对大型 .csv 文件进行子集化以提取特定年份。

到目前为止,我所做的是使用 fread 读取整个 .csv 文件,然后按日期读取子集。

下面是一个示例(注意我生成了一些示例数据,而不是使用 fread 读取它):

# Example data.table created after reading in from fread
library("data.table")
DT <- data.table(seq(as.Date("1999-01-01"), as.Date("2009-01-01"), by="day"))
DT$Var <- sample(1000, size=nrow(DT), replace=TRUE)
colnames(DT) <- c("Date", "Var")

# subset to extract data for the year 2004
DT_2004 <- subset(DT, Date %in% as.Date("2004-01-01"):as.Date("2004-12-31"))

这可行,但需要我先读入整个 .csv 文件,对于非常大的 .csv 文件,这非常耗时。有没有办法在 fread 中保留 .csv 文件,以便我只读取我想要的日期?

谢谢。

【问题讨论】:

  • 正在使用fread 读取文件并且子集化比推荐的选项here 慢吗?
  • this 也值得一看

标签: r data.table fread


【解决方案1】:

我不认为fread 是问题所在。我已经使用fread 和 350 万行 csv 文件,它并不慢!我认为缓慢可能是由于使用 POSIXct 日期造成的。尝试改用IDate。在data.table 帮助中查找?IDateTime。说明指出:

具有整数存储的日期和时间类,用于快速排序和 分组。仍处于实验阶段!

但这不是问题。对于您的具体问题,请尝试以下操作。

DT <- data.table(Date=seq(as.IDate("1999-01-01"),as.IDate("2009-01-01"),by="day"))
DT[,Var:=sample(1000,size=nrow(DT),replace=TRUE)]   # ?`:=`
DT_2004 = DT[between(Date,as.IDate("2004-01-01"),as.IDate("2004-12-31")),.SD]   # ?between

也许会有更多知识渊博的人来纠正我们的误解!在那之前,我希望这会有所帮助。

【讨论】:

  • 感谢您的回复。我确实同意,与其他方法相比,Fread 读取数据的速度更快。不过,用 Fread 读取我的数据集大约需要 5-10 分钟,所以我只是想知道我想要读取的日期是否可以在 Fread 代码中规定。我会给出你选择年份的方法。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2013-07-09
  • 2018-12-21
  • 2016-05-05
  • 2020-08-23
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多