【发布时间】:2025-11-30 03:30:02
【问题描述】:
我的数据如下所示:
timedelta64 1, temp1A, temp 1B, temp1C, ...
timedelta64 2, temp2A, temp 2B, temp2C, ...
数据被摄取到两个 numpy 数组中:
-
一系列时间戳
raw_timestamp、dtype=[('datetime', '<M8[s]')]'2009-01-01T18:41:00', '2009-01-01T18:44:00', '2009-01-01T18:46:00', '2009-01-01T18:47:00', -
传感器数据表
raw_sensor、dtype=[ ('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')](755, 855, 755, 855, 743, 843, 743, 843, 2), (693, 793, 693, 793, 693, 793, 693, 793, 1), (755, 855, 755, 855, 743, 843, 743, 843, 2), (693, 793, 693, 793, 693, 793, 693, 793, 1),
我生成一个新的filled_timestamp 并在每个时间步的每一行填充时间戳:filled_timestamp = np.arange(np.datetime64(starttime), np.datetime64(endtime), np.timedelta64(interval))
使用idxs = np.in1d(filled_timestamp,raw_timestamp),我有filled 的所有索引与raw 的时间戳相匹配。所以我可以用来自raw_sensor的匹配数据分配filled_sensor
filled_sensor[idxs] = raw_sensor
第一季度。有没有更好/更快的方法来交叉这些?
现在filled 数组看起来像:
>>> filled_timestamp, filled_sensor # shown side-by-side for convenience
array([
1 # ('2009-01-01T18:41:00') (755, 855, 755, 855, 743, 843, 743, 843, 2),
2 # ('2009-01-01T18:42:00') (0, 0, 0, 0, 0, 0, 0, 0, 0),
3 # ('2009-01-01T18:43:00') (0, 0, 0, 0, 0, 0, 0, 0, 0),
4 # ('2009-01-01T18:44:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
5 # ('2009-01-01T18:45:00') (0, 0, 0, 0, 0, 0, 0, 0, 0),
6 # ('2009-01-01T18:46:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
7 # ('2009-01-01T18:47:00') (693, 793, 693, 793, 693, 793, 693, 793, 1)
],
dtype=[('datetime', '<M8[s]')], [('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')]
第二季度。如何用前一个非空行中的值填充缺失的行?除了列(0 和 3 和最后一个),它是 0 用于填充
在我上面的例子中:
第 2 行和第 3 行将从第 1 行获取值,
第 5 行将从第 4 行获取值
最终结果:
>>> filled_timestamp, filled_sensor # shown side-by-side for convenience
array([
1 # ('2009-01-01T18:41:00') (755, 855, 755, 855, 743, 843, 743, 843, 2),
2 # ('2009-01-01T18:42:00') (0, 855, 755, 0, 743, 843, 743, 843, 0),
3 # ('2009-01-01T18:43:00') (0, 855, 755, 0, 743, 843, 743, 843, 0),
4 # ('2009-01-01T18:44:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
5 # ('2009-01-01T18:45:00') (0, 793, 693, 0, 693, 793, 693, 793, 0),
6 # ('2009-01-01T18:46:00') (693, 793, 693, 793, 693, 793, 693, 793, 1),
7 # ('2009-01-01T18:47:00') (693, 793, 693, 793, 693, 793, 693, 793, 1)
],
dtype=[('datetime', '<M8[s]')], [('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')]
【问题讨论】:
-
您的数据有多大?
-
数据大小为千兆字节 (GB)
-
您是否考虑将时间拆分为一个单独的数组?
-
是的,如果数组的尺寸不会改变。由于不依赖时间戳本身,我可以稍后拆分和重组。
-
然后您可以使用类型为 timestamp64 的单个 t 轴和行 x 传感器 2D 阵列,而无需使用场阵列。这会让生活更轻松。