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
,尤其是AWESOME
fread
函数。我的文件包含以字符串形式加载的日期(因为我不知道如何加载),看起来像
01APR2008:09:00:00

我需要在这些日期时间对data.table进行排序,然后以
IDateTime
格式(或者我还不知道的任何格式)对排序进行有效转换

看起来我无法执行
DT[,newType:=IDateTime(strTime(旧类型,“%d%b%Y:%H:%M:%S”)]

我的问题是:

  • 有没有一种方法可以从
    fread
    直接转换到
    IDateTime
    ,这样我以后就可以高效地排序
  • 如果没有,那么知道我希望能够通过这个datetime列对DT进行排序,最有效的方法是什么
  • 不幸的是(为了提高效率)
    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