直接将字符串转换为IDateTime

sta*_*ant 12 datetime r data.table

我正在使用新版本,data.table特别是AWESOME fread功能.我的文件包含作为字符串加载的日期(因为我不知道这样做),看起来像01APR2008:09:00:00.

我需要梳理这些日期时间的data.table,然后排序是有效的投,然后IDateTime格式(或任何ALSE我还不知道).

> strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")
[1] "2008-04-01 09:00:00"

> IDateTime(strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S"))
        idate    itime
1: 2008-04-01 09:00:00

> IDateTime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")
Error in charToDate(x) : 
character string is not in a standard unambiguous format 
Run Code Online (Sandbox Code Playgroud)

看起来我做不到DT[ , newType := IDateTime(strptime(oldType, "%d%b%Y:%H:%M:%S"))].

我的问题是:

  1. 有没有一种方法可以直接转换为IDateTimefread,这样我可以排序后有效?
  2. 如果没有,那么知道我希望能够通过此日期时间列对DT进行排序的最有效方法是什么

Mat*_*wle 11

不幸的是(为了效率)strptime产生一个POSIXlt类型,它不受支持,data.table并且总是因为它的大小(每个日期40个字节!)和结构.虽然strftime产生了更好的POSIXct,但它仍然通过POSIXlt实现.更多信息:

http://stackoverflow.com/a/12788992/403310
Run Code Online (Sandbox Code Playgroud)

寻找基本函数,例如as.Date,它也使用strptime,创建一个存储为double的epoch(奇怪)的整数偏移量.将IDate在(朋友)班data.table的目的是实现存储,嗯,整数整数划时代偏移.适合快速排序base::sort.list(method = "radix")(实际上是一种计数排序).IDate并不真正意图快速(通常是一次性)转换.

因此,要正确或错误地转换字符串日期/时间,我倾向于使用自己的帮助函数.

如果字符串日期是"2012-12-24"我倾向于:as.integer(gsub("-", "", col))并继续YYYYMMDD整数日期.类似地,时间可以是HHMMDD整数.两列:datetime分别是有用的,如果你一般要roll = TRUE在一天之内,而不是前一天.按月分组简单快捷:by = date %/% 100L.添加和减去天数很麻烦,但无论如何,因为您很少想要添加日历日,而不是工作日或工作日.无论如何,这是对您的工作日矢量的查找.

在您的情况下,角色月份需要转换为1:12.您的日期"01APR2008"中没有分隔符,因此a substring将是一种方式,后跟一个matchfmatch月份名称.你在控制文件格式吗?如果是这样,数字在一个明确的格式中更好,这种格式自然地排序,例如%Y-%m-%d,或%Y%m%d.

我还没有最好的做到这一点fread,因此日期/时间保留为字符,因为我还不确定如何检测日期格式或输出哪种类型.它确实需要输出整数或双日期,而不是低效的字符.我怀疑我对YYYYMMDD整数的使用被认为是非常规的,所以我有点犹豫要不要将它作为默认值.他们有自己的位置,也有基于时代的日期的利弊.日期不总是被时代是基于所有我的建议.

你怎么看?顺便说一句,谢谢你的鼓励fread; 很高兴看到.