我有一项艰巨的任务需要解决。 我目前正在使用非常高频率的时间序列数据。数据以毫秒/微秒测量。他们的间隔不一样。
注意到
1小时= 60分钟= 3600秒。
1秒= 1,000毫秒= 1,000,000微秒
这就是为什么我说我的数据是 超高频率 。 据我所知,Matlab中的时间序列对象仅支持二级数据。我真的需要转换我的时间序列,例如10毫秒数据或100毫秒数据。
这意味着,例如,如果我希望我的时间序列在10毫秒内,原始数据只有5毫秒,6毫秒和12毫秒的数据点。
我将6毫秒作为最新的数据点,将其视为10毫秒的数据。
有时我需要总结数据间隔,但目前不是很重要。
我会重现一些数据,如下所示:
TimeStamp=
[66846720;67567616;67567617;67567618;67567619;67567620;67567621;67633152;...
67633153;67633154;67633155;67633156;67633157;67633158;67633159;67633160;...
67633161;67633162;482410496;495583232;495583233;807206912;1422721024;...
1596325888;1766457344];
Value = [2094.75;2094.75;2094.75;2094.75;...
2094.75;2094.75;2094.75;2094.75;2094.75;...
2094.75 ;2094.75 ;2094.75;2094.75;2094.75;...
2094.75 ;2094.75 ;2094.75;2094.75;2094.5;...
2094.75 ;2094.75 ;2094.5 ;2094.5 ;2094.75;2094.5]
TimeStamp 以毫秒为单位,以及 UTC时间
我这样做的方法是生成一系列说m = 10毫秒, 10,20,30,40 .....
然后我使用一个大循环找到每10毫秒最近的数据点,效率非常低,通常需要很长时间才能运行......
请发布任何建议或好方法,我们将非常感谢您的帮助
如果有现有的软件包,其他语言也会很好。
答案 0 :(得分:1)
在R中,您可以考虑使用POSIXct
类作为时间戳。
在?DateTimeClasses
我们读到了
类“POSIXct”表示自1970年初(在UTC时区)以来作为数字向量的(带符号)秒数。
还要注意参数:
数字计算的有效位数:应足够高,以准确表示最不重要的时间单位。
请注意,重要位的默认值为15.因为小数点前面有10位数,例如as.numeric(as.POSIXct(Sys.time()))
,所以在小数点后面会留下5位数点,或1e-5
秒精度,这可能是不够的,所以也许可以使用digits=18
或20
等来缓冲。
要将观察结果汇总到最近的1e-5
秒(10微秒),您可以使用?round.POSIXt
,如下所示:
round(x, units = "secs", digits=5)
其中x
是向量,因此您不需要for循环。