R 直接将字符串强制转换为IDateTime
我正在使用新版本的R 直接将字符串强制转换为IDateTime,r,datetime,data.table,R,Datetime,Data.table,我正在使用新版本的data.table,尤其是AWESOMEfread函数。我的文件包含以字符串形式加载的日期(因为我不知道如何加载),看起来像01APR2008:09:00:00 我需要在这些日期时间对data.table进行排序,然后以IDateTime格式(或者我还不知道的任何格式)对排序进行有效转换 看起来我无法执行DT[,newType:=IDateTime(strTime(旧类型,“%d%b%Y:%H:%M:%S”)] 我的问题是: 有没有一种方法可以从fread直接转换到IDate
data.table
,尤其是AWESOMEfread
函数。我的文件包含以字符串形式加载的日期(因为我不知道如何加载),看起来像01APR2008:09:00:00
我需要在这些日期时间对data.table进行排序,然后以IDateTime
格式(或者我还不知道的任何格式)对排序进行有效转换
看起来我无法执行DT[,newType:=IDateTime(strTime(旧类型,“%d%b%Y:%H:%M:%S”)]
我的问题是:
fread
直接转换到IDateTime
,这样我以后就可以高效地排序strtime
生成了一个POSIXlt类型,该类型不受数据的支持。表
总是由于其大小(每个日期40字节!)和结构。尽管strftime产生了更好的POSIXct,但它仍然通过POSIXlt实现。更多信息请点击此处:
http://stackoverflow.com/a/12788992/403310
查看基本函数,例如as.Date
,它也使用strtime
,从存储为double的历元(奇怪的是)创建一个整数偏移量。data.table
中的IDate
(和friends)类的目标是实现存储为嗯整数的整数历元偏移量。适用于通过base::sort.list(method=“radix”)
进行快速排序(这实际上是一种计数排序)IDate
并非真正以快速(通常是一次性)转换为目标
因此,为了正确或错误地转换字符串日期/时间,我倾向于使用自己的helper函数
如果字符串日期是“2012-12-24”
我倾向于:作为.integer(gsub(“-”,“”,col))
并继续执行YYYYMMDD
整数日期。类似地,时间可以作为整数HHMMDD
。如果您通常希望在一天内roll=TRUE
,而不是前一天,则可以使用两列:date
和time
。按月份分组既简单又快速:by=date%/%100L
。增加和减少天数很麻烦,但无论如何,这是因为您很少想添加日历天数,而不是工作日或工作日。因此,这是对您的工作日向量的查找
在您的情况下,字符月份需要转换为1:12
。您的日期“01APR2008”中没有分隔符,因此子字符串
将是一种方式,在月份名称上后跟匹配
或匹配
。你能控制文件格式吗?如果是这样的话,数字最好采用自然排序的明确格式,如%Y-%m-%d
,或%Y%m%d
在fread
中,我还不知道如何最好地实现这一点,因此日期/时间当前保留为字符,因为我还不确定如何检测日期格式或输出哪种类型。但它需要输出整数或双日期,而不是低效的字符。我怀疑我使用的YYYYMMDD
整数被认为是非常规的,所以我有点犹豫是否将其作为默认值。它们有自己的位置,基于时代的日期也有利弊。我的建议是,日期不必总是以时代为基础
你觉得怎么样?顺便说一句,感谢您在fread上的鼓励;很高兴看到。我不知道您的文件是如何构造的,但是从您的评论来看,您希望使用日期字段作为键。为什么不把它作为一个时间序列来阅读,并在阅读时格式化它呢 这里我使用zoo来实现这一点。(这里我假设date列是第一列,否则请参见
index.colum
argument)
在这里,您肯定仍要进行两次转换,但您在读取数据时会进行转换,第二次转换时不会处理任何格式问题。您能展示数据文件的外观吗?您好,该文件是一个csv文件,带有
sep=“;”
,日期格式类似于“01APR2008:09:00:00”
,即格式=“%d%b%Y:%H:%M:%S”
。我所做的是DT[,date:=IDate(oldType,“%d%b%Y”);DT[,time:=ITime(oldType,“%d%b%Y:%H:%M:%S”)]
最后setkeyv(DT,c(“date”,“time”)
日期是数据的第一列?嘿,Matthew谢谢你的回答,我想有一种可能是允许像read.csv中那样的colClasses参数。毕竟,您可以在(请原谅我从另一篇文章中摘取的示例)setAs(“character”,“myDate”,function(from)as.Date(from,format=“%d/%m/%y”)R)system.time中指定自己的格式(此外,我认为如果你能在软件包中添加微秒级的解析时间,你会接触到更多的人。所有HFTraders/Quant都在玩这个东西…(可以说他们不应该使用R,但我们不要去那里)同意,colClasses
已经在要添加的列表中(要做的事情列表在fread.c的顶部),但作为一个命名向量,它允许覆盖特定的列,而不需要全部指定它们。这实际上更多的是关于默认值的问题。我想,POSIXct
,那么。它已经支持微秒了,所以我不认为这是任何特殊的数据。table
需要支持真正的iiuc(除了fread,我还可以直接快速地加载它们)。不过,我想使用fread的主要原因是使用双分隔文件(sep2),比如在基因组学中。
http://stackoverflow.com/a/12788992/403310
ff <- function(x) as.POSIXct(strptime(x,"%d%b%Y:%H:%M:%S"))
h <- read.zoo(text = "03avril2008:09:00:00 125
02avril2008:09:30:00 126
05avril2008:09:10:00 127
04avril2008:09:20:00 128
01avril2008:09:00:00 128"
,FUN=ff)
IDateTime(index(h))
idate itime
1: 2008-04-01 09:00:00
2: 2008-04-02 09:30:00
3: 2008-04-03 09:00:00
4: 2008-04-04 09:20:00
5: 2008-04-05 09:10:00