r语言 - 如何避免读取日期为read中的IDate



同样的问题在这里没有解决方案,如何避免读取()导入日期信息作为IDate?

旧的问题不是很具体,并且混合了一些其他问题,也没有包含我在这里提出的代表。因此,我正在改进这个问题。请不要标记为重复:-)

问题是:每当我使用data.table:: fread读取包含日期列的csv文件时,它将Date列的类更改为IDate。我如何避免这种情况并将其保持为日期格式?

library(data.table)
library(magrittr)
dt <- data.table(datecol = seq(Sys.Date(),by = "1 day",length.out = 3))
# let's confirm the format of the column is Date
str(dt)
#> Classes 'data.table' and 'data.frame':   3 obs. of  1 variable:
#>  $ datecol: Date, format: "2022-05-10" "2022-05-11" ...
#>  - attr(*, ".internal.selfref")=<externalptr>
# Now we write it into a file and read back using fwrite and fread
fwrite(dt,"tmpoutput.csv")
fread("tmpoutput.csv") %>% str
#> Classes 'data.table' and 'data.frame':   3 obs. of  1 variable:
#>  $ datecol: IDate, format: "2022-05-10" "2022-05-11" ...
#>  - attr(*, ".internal.selfref")=<externalptr>
# as you see the date format changes to IDate

在2022-05-10由reprex包(v2.0.1)创建

这不是一个大问题,但它需要一个额外的代码行每次读取文件后,即dt[,datecol:=as_date(datecol = as_date(datecol)],使rbind与类似的DT不会失败。

是否有更简单的方法来避免这种情况,因为如果我们稍后忘记进行类型转换,这是一个潜在的bug原因?

在@Wimpel答案的基础上,您可以简单地使用colClasses参数指定列类:

fread("tmpoutput.csv",colClasses=c(datecol='Date')) %>% str
Classes ‘data.table’ and 'data.frame':  3 obs. of  1 variable:
$ datecol: Date, format: "2022-05-10" "2022-05-11" "2022-05-12"
- attr(*, ".internal.selfref")=<externalptr> 

您可以创建一个新类(这里是:importDate),并在read中的colClasses参数中引用它。这将强制将给定的列作为Date读取(而不是默认的iDate)。

setClass("importDate")
# conversion
setAs("character", "importDate", function(from) as.Date(from))
# Now read, use a named vector in colClasses, so only identify the cols you explicitly want to convert to Date
fread("tmpoutput.csv", colClasses = c(datecol = "importDate")) %>% str
# Classes ‘data.table’ and 'data.frame':    3 obs. of  1 variable:
#   $ datecol: Date, format: "2022-05-10" "2022-05-11" "2022-05-12"
# - attr(*, ".internal.selfref")=<externalptr>

最新更新