如何将含时间戳与传感器的Pandas DataFrame转为三维Numpy数组?
问题:将带缺失的传感器时序数据转换为(T, N, 4)的NumPy数组
我有一个数据表,列名包括['datetime', 'sensorid', 'sms-in', 'sms-out', 'call-in', 'call-out'],总计10000个传感器。理想情况下每个时间戳对应10000行数据,但部分时间戳可能存在传感器行缺失(例如仅9998行)。数据表示例如下:
sms-in sms-out call-in call-out datetime sensorid 2013-10-31 23:00:00 1 0.223227 0.156787 0.160938 0.052275 2 0.222201 0.147617 0.164946 0.054712 3 0.221109 0.137855 0.169213 0.057306 4 0.226198 0.183349 0.149327 0.045216 5 0.205065 0.175393 0.139139 0.043455 ... ... ... ... ... 2013-11-01 22:50:00 9996 0.695404 0.440369 0.087566 0.310581 9997 0.687958 0.429974 0.085995 0.243143 9998 0.687958 0.429974 0.085995 0.256862 9999 0.894907 0.518741 0.085995 0.230476 10000 1.212911 0.638219 0.085995 0.090769 [1439982 rows x 4 columns]
需要将最后4列['sms-in', 'sms-out', 'call-in', 'call-out']作为传感器的特征,将该DataFrame转换为形状为(T, N, 4)的NumPy数组(其中T代表时间戳数量,N代表传感器数量),希望用高效的Pandas API实现,避免迭代行的低效方法。
解决方案
可以利用Pandas的向量化重塑操作实现,无需手动迭代行,以下是两种高效实现方式:
方法1:使用pivot_table
适用于原始DataFrame是普通列索引(非多层索引)的情况:
- 透视数据,将时间戳作为行、传感器ID作为列、特征作为值:
pivoted = df.pivot_table( index='datetime', columns='sensorid', values=['sms-in', 'sms-out', 'call-in', 'call-out'] )
- 填充缺失值(缺失的传感器行对应位置会生成NaN,可根据需求选择填充策略):
pivoted = pivoted.fillna(0) # 示例用0填充,也可使用前向填充`fillna(method='ffill')`等
- 转换为NumPy数组并调整形状:
T = pivoted.shape[0] # 时间戳数量 N = df['sensorid'].nunique() # 传感器总数 result_array = pivoted.to_numpy().reshape(T, N, 4)
方法2:使用unstack
如果原始DataFrame已经是datetime+sensorid的多层索引(如示例所示),可以直接使用unstack快速重塑:
- 将
sensorid层索引转为列:
unstacked = df.unstack(level='sensorid')
- 填充缺失值:
unstacked = unstacked.fillna(0)
- 调整数组形状:
T = unstacked.shape[0] N = unstacked.columns.get_level_values('sensorid').nunique() result_array = unstacked.to_numpy().reshape(T, N, 4)
关键说明
- 两种方法均基于Pandas的内置向量化操作,效率远高于循环迭代行
- 缺失值填充可根据业务场景调整,比如用对应传感器的历史均值填充:
pivoted = pivoted.groupby(level='sensorid').transform(lambda x: x.fillna(x.mean())) - 最终数组维度严格为
(T, N, 4),满足时序-传感器-特征的三维结构要求
内容的提问来源于stack exchange,提问作者skypitcher
相关产品推荐
相关产品推荐

