You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含时间戳与传感器的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是普通列索引(非多层索引)的情况:

  1. 透视数据,将时间戳作为行、传感器ID作为列、特征作为值:
pivoted = df.pivot_table(
    index='datetime',
    columns='sensorid',
    values=['sms-in', 'sms-out', 'call-in', 'call-out']
)
  1. 填充缺失值(缺失的传感器行对应位置会生成NaN,可根据需求选择填充策略):
pivoted = pivoted.fillna(0)  # 示例用0填充,也可使用前向填充`fillna(method='ffill')`等
  1. 转换为NumPy数组并调整形状:
T = pivoted.shape[0]  # 时间戳数量
N = df['sensorid'].nunique()  # 传感器总数

result_array = pivoted.to_numpy().reshape(T, N, 4)

方法2:使用unstack

如果原始DataFrame已经是datetime+sensorid的多层索引(如示例所示),可以直接使用unstack快速重塑:

  1. 将sensorid层索引转为列:
unstacked = df.unstack(level='sensorid')
  1. 填充缺失值:
unstacked = unstacked.fillna(0)
  1. 调整数组形状:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:07:52