如何在数据帧上矢量化和加速strtime()日志时间转换

如何在数据帧上矢量化和加速strtime()日志时间转换,r,dataframe,string-conversion,date-conversion,vectorization,R,Dataframe,String Conversion,Date Conversion,Vectorization,(编辑:这里的一个问题是scale,即在200000*50的数据帧上,对一行起作用的内容将放大/崩溃R。例如,strtime必须按列应用,而不是按行应用,以避免挂起。 我正在寻找实际在200000*50上运行的工作代码解决方案,包括测量的运行时,而不仅仅是随意的“这很容易”备注。如果您选择了错误的fn,很容易得到运行时间>12小时。接下来,我还要求您加快我的零时间调整代码,直到完成这项工作,这项工作才结束。目前为止,没有人尝试过。) 我想矢量化并加速以下多步骤日志时间转换,精度为毫秒,包括将s

(编辑:这里的一个问题是scale,即在200000*50的数据帧上,对一行起作用的内容将放大/崩溃R。例如,strtime必须按列应用,而不是按行应用,以避免挂起。 我正在寻找实际在200000*50上运行的工作代码解决方案,包括测量的运行时,而不仅仅是随意的“这很容易”备注。如果您选择了错误的fn,很容易得到运行时间>12小时。接下来,我还要求您加快我的零时间调整代码,直到完成这项工作,这项工作才结束。目前为止,没有人尝试过。)


我想矢量化并加速以下多步骤日志时间转换,精度为毫秒,包括将
strtime()
转换为单个数字,然后进行减法运算,然后在大数据帧上进行
log()
(200000行*300列;省略其他(非时间)列)。 代码如下。 除了使其矢量化和快速化,另一个问题是我不确定如何最好地表示每个步骤的(高维)中间值(例如,作为strtime、matrix、vector中的列表)。我已经尝试了
apply、sappy、lappy、vapply、ddply::maply(),…
但是中间格式的不兼容性一直困扰着我

每行有50列time1..time50(chr,format=“HH:MM:SS.sss”)以毫秒分辨率将时间表示为字符串。我需要毫秒精度。 在每一行中,列time1..time50按非降序排列,我想将它们转换为time50之前的时间日志。转换fn
parsehhmmsecms()
位于底部,需要严重的矢量化和加速,您可以看到注释掉的替代版本。到目前为止,我的计算是:
strtime()
比(多个)
substr()
调用要快,然后我以某种方式转换为三个数值
(hh,mm,sec.ms)
,然后转换为向量,假设下一步应该是向量乘以
%*%c(3600,60,1)
转换为数值秒。 这里是我为每一行和每一个时间字符串所做的伪代码;完整代码位于底部:

 for each row in dataframe { # vectorize this, loop_apply(), or whatever...
 #for each time-column index i ('time1'..'time50') { # vectorize this...
 hhmmsecms_50 <- parse_hhmmsecms(xx$time50[i])
 # Main computation
 xx[i,Clogtime] <- -10*log10(1000*(hhmmsecms_50 - parse_hhmmsecms(xx[i,Ctime]) ))
 # Minor task: fix up all the 'zero-time' events to be evenly spaced between -3..0
 #}
 }

你可能把事情搞得太复杂了

从基类开始,基类的表现非常好(在适当的操作系统上甚至是微秒),但请注意

  • 您需要设置
    选项(“digits.secs”=7)
    (这是可以显示的最大值)才能看到它们的显示

  • 对于
    strtime
    等,您需要一个额外的解析字符

  • 所有这些都在文档中,这里还有无数的例子

    快速示例:

    R> someTime <- ISOdatetime(2011, 12, 27, 2, 3, 4.567)
    R> someTime
    [1] "2011-12-27 02:03:04.567 CST"
    R> now <- Sys.time()
    R> now
    [1] "2011-12-27 16:48:20.247298 CST"      # microsecond display on Linux
    R> 
    R> txt <- "2001-02-03 04:05:06.789123"
    R> strptime(txt, "%Y-%m-%d %H:%M:%OS")    # note the %0S for sub-seconds
    [1] "2001-02-03 04:05:06.789123"
    R> 
    
    R>有时
    [1] “2011-12-27 02:03:04.567 CST”
    R> 现在
    [1] “2011-12-27 16:48:20.247298 CST”#Linux上的微秒显示
    R>
    R> txt strptime(txt,“%Y-%m-%d%H:%m:%OS”)#记下%0S的秒数
    [1] "2001-02-03 04:05:06.789123"
    R>
    

    而诸如
    strptime
    as.POSIXct
    等关键函数都是矢量化的,您可以向它们抛出整列。

    看看矢量化的内置strptime函数以及相关的POSICct和POSIXlt类。实际上,您可以在向量上应用strtime并将其转换为数值。有许多内置的时间处理函数。John,不,我几周前就尝试过了,
    as.POSIXlt()
    转换丢弃毫秒(chron和zoo似乎同样无法使用)。我在第一次谷歌搜索尝试中发现了这一点。(事实上,这是第一个结果。)事实上,asPOSIXlt确实存储ms,但不显示ms,除非您使用选项('digits.secs'=3)(我的代码中已经有了选项,但注释掉了)。零时间修复代码(不是strtime部分)现在是最慢的部分,还没有人尝试过。请在200000*50数据帧或类似数据帧上发布您的实际运行时间。我现在的时间超过12小时。谢谢,但是数据集是csv格式的,如果你在colClasses中读取日期并执行strptime,我似乎记得它会极大地破坏内存。我将分片重试。不希望使用假日期存储时间的第二个原因,例如“2001-02-03”,是因为我打印时间,比较时间(<>==),操作时间,根据时间进行聚合,将时间用作图表或直方图标签等。但是,是的,我可以使用
    作为数字(strtime(…)-origin_date)
    您可以而且可能应该在
    日期
    POSIXct
    类上进行算术运算。如果你只有小时:分钟:秒,可以把它们附加到2001-01-01或其他的名义基准日期上。内存问题是众所周知的,不幸的是,这似乎是我们必须为
    strtime
    的通用性付出的代价。零时间修复代码现在是缓慢的部分,请您也解决这个问题好吗?按行执行零时间修正需要>12小时。请在200000*50数据帧或类似数据帧上发布您的实际运行时间。
    R> someTime <- ISOdatetime(2011, 12, 27, 2, 3, 4.567)
    R> someTime
    [1] "2011-12-27 02:03:04.567 CST"
    R> now <- Sys.time()
    R> now
    [1] "2011-12-27 16:48:20.247298 CST"      # microsecond display on Linux
    R> 
    R> txt <- "2001-02-03 04:05:06.789123"
    R> strptime(txt, "%Y-%m-%d %H:%M:%OS")    # note the %0S for sub-seconds
    [1] "2001-02-03 04:05:06.789123"
    R>