如何在数据帧上矢量化和加速strtime()日志时间转换
(编辑:这里的一个问题是scale,即在200000*50的数据帧上,对一行起作用的内容将放大/崩溃R。例如,strtime必须按列应用,而不是按行应用,以避免挂起。 我正在寻找实际在200000*50上运行的工作代码解决方案,包括测量的运行时,而不仅仅是随意的“这很容易”备注。如果您选择了错误的fn,很容易得到运行时间>12小时。接下来,我还要求您加快我的零时间调整代码,直到完成这项工作,这项工作才结束。目前为止,没有人尝试过。)如何在数据帧上矢量化和加速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
我想矢量化并加速以下多步骤日志时间转换,精度为毫秒,包括将
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之前的时间日志。转换fnparsehhmmsecms()
位于底部,需要严重的矢量化和加速,您可以看到注释掉的替代版本。到目前为止,我的计算是: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>