同样的问题在这里没有解决方案,如何避免读取()导入日期信息作为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>