如何避免 fread() 将日期信息导入为 IDate?

问题描述 投票:0回答:2

我最初编写了一个脚本,该脚本通过约 70k 次迭代进行计算,我使用 rbind 将结果“缝合”在一起(1 次迭代可能会产生 0 到多行的结果,所以我不认为预先分配输出说得通)。为了加快速度,我将其分成 4 个单独的脚本,每个脚本在单独的会话中处理 25% 的迭代,并将其解决方案(每个在 150k-400k 行之间)写入 csv,这些解决方案全部读回到单个脚本中进行绑定一起解决方案

我的其中一列有问题 - 它包含一个日期,在 csv 中它们存储为“dd-mm-yy”... 脚本 1、2 和 4 按预期读入 - 它们存储为“字符”类型,这对我来说没问题。然而,脚本 3 将日期列作为 IDate 读取,并在字符串前面添加“00”

rbind 不喜欢具有不同的数据类型,我可以通过在文件 3 的 fread 中包含 colClasses = c(DATE = "character") 来“使其工作”,但是我更愿意理解为什么会这样发生并假设我可以在 fwrite 阶段调整一些东西?

r fwrite fread
2个回答
1
投票

问题似乎出在原始数据的日期格式上,一切都是通过在写入 csv 文件之前将数据传递给 as.Date 来实现的

感谢 @thelatemail 指出:“最新版本的 fread 自动猜测日期格式 - https://www.rdocumentation.org/packages/data.table/versions/1.14.0/topics/fread -”bit64: :integer64、IDate 和 POSIXct 类型也能被检测并直接读取,无需在转换前读取为字符。"

我仍然不是 100% 确定为什么只有 4 个中的 1 个被读取为日期,而其他读取为字符,但我的假设是“dd-mm-yy”格式对于 fread 的解释来说是不明确的,因此应该避免可能


0
投票

目前,您可以通过以下方式执行此操作:

options(datatable.old.fread.datetime.character=T)

在“data.table v1.14.0(2021 年 2 月 21 日)”下的 data.table 包的 NEWS 文件中,它显示“与以前一样,迁移选项 datatable.old.fread.datetime.character 仍可以设置为TRUE 则恢复到旧的角色行为。此迁移选项是临时的,将在不久的将来被删除。”但从版本 1.14.8(当前最新的非开发版本)开始,此选项仍然有效。

将日期读取为字符会使 data.table::fread() 变慢并且使内存使用率更高,但如果你确实需要这样做,有一种方法。

© www.soinside.com 2019 - 2024. All rights reserved.