如何将时间序列的numpy数组重塑为24小时×天数的矩阵
问题:将时间序列NumPy数组整理为24小时×天数的矩阵
如何将时间序列的numpy数组整理为一侧为24小时、另一侧为天数的矩阵?例如,若我有一组始于2022年4月4日3时、止于2022年4月5日23时的温度值numpy数组,该如何将其整理为形状为24×2的数组?
示例数据:
2022-04-04 03:00:00 -14.310345 2022-04-04 04:00:00 -15.910526 2022-04-04 05:00:00 -16.983607 2022-04-04 06:00:00 -16.913793 2022-04-04 07:00:00 -14.558333 2022-04-04 08:00:00 -12.308197 2022-04-04 09:00:00 -14.026667 2022-04-04 10:00:00 -14.249180 2022-04-04 11:00:00 -13.754237 2022-04-04 12:00:00 -15.513793 2022-04-04 13:00:00 -16.116667 2022-04-04 14:00:00 -16.140385 2022-04-04 15:00:00 -14.542593 2022-04-04 16:00:00 -11.738983 2022-04-04 17:00:00 -14.703333 2022-04-04 18:00:00 -16.401754 2022-04-04 19:00:00 -16.650000 2022-04-04 20:00:00 -14.365517 2022-04-04 21:00:00 -16.900000 2022-04-04 22:00:00 -16.805085 2022-04-04 23:00:00 -16.501639 2022-04-05 00:00:00 -13.478333 2022-04-05 01:00:00 -16.383333 2022-04-05 02:00:00 -16.833898 2022-04-05 03:00:00 -16.737705 2022-04-05 04:00:00 -13.729508 2022-04-05 05:00:00 -16.415254 2022-04-05 06:00:00 -16.845763 2022-04-05 07:00:00 -16.870833 2022-04-05 08:00:00 -14.007692 2022-04-05 09:00:00 -15.152727 2022-04-05 10:00:00 -15.581356 2022-04-05 11:00:00 -16.036667 2022-04-05 12:00:00 -13.496429 2022-04-05 13:00:00 -14.760656 2022-04-05 14:00:00 -16.254237 2022-04-05 15:00:00 -16.733333 2022-04-05 16:00:00 -11.578689 2022-04-05 17:00:00 -13.713333 2022-04-05 18:00:00 -15.933333 2022-04-05 19:00:00 -17.070492 2022-04-05 20:00:00 -15.570492 2022-04-05 21:00:00 -15.730508 2022-04-05 22:00:00 -17.370000 2022-04-05 23:00:00 -16.962295
解决方案
方法1:用Pandas处理(更简便)
利用Pandas的时间序列工具可以快速完成分组和重塑:
- 将原始数据转为带时间索引的DataFrame,拆分出日期和小时维度
- 通过透视表将数据重组为「小时×日期」的结构
- 转换为NumPy数组即可
代码示例:
import pandas as pd import numpy as np # 模拟原始数据(替换为你实际的时间和温度数组) raw_data = [ ["2022-04-04 03:00:00", -14.310345], ["2022-04-04 04:00:00", -15.910526], # ... 其余数据省略 ["2022-04-05 23:00:00", -16.962295] ] # 构建DataFrame并解析时间 df = pd.DataFrame(raw_data, columns=["timestamp", "temp"]) df["timestamp"] = pd.to_datetime(df["timestamp"]) df["temp"] = df["temp"].astype(float) # 提取日期和小时字段 df["date"] = df["timestamp"].dt.date df["hour"] = df["timestamp"].dt.hour # 生成透视表:行=小时,列=日期,值=温度 pivot_table = df.pivot(index="hour", columns="date", values="temp") # 转为24×2的NumPy数组 result = pivot_table.to_numpy() print(result.shape) # 输出 (24, 2)
方法2:纯NumPy实现
如果不需要依赖Pandas,可以通过时间戳的数值运算来分组:
- 将时间字符串转为
datetime64类型,提取小时和日期基准 - 对日期去重,确定总天数
- 初始化数组并按小时和日期索引填充温度值
代码示例:
import numpy as np # 模拟原始数据 timestamps_str = np.array([ "2022-04-04 03:00:00", "2022-04-04 04:00:00", # ... 其余数据省略 "2022-04-05 23:00:00" ]) temps = np.array([ -14.310345, -15.910526, # ... 其余数据省略 -16.962295 ], dtype=np.float64) # 转换为小时精度的datetime64数组 timestamps = np.array(timestamps_str, dtype="datetime64[h]") # 提取小时(0-23)和日期基准(当天0点) hours = timestamps.astype(int) % 24 dates = timestamps.astype("datetime64[D]") # 获取唯一日期及对应的索引 unique_dates, date_idx = np.unique(dates, return_inverse=True) num_days = len(unique_dates) # 初始化结果数组,缺失值用nan填充 result = np.full((24, num_days), np.nan) result[hours, date_idx] = temps print(result.shape) # 输出 (24, 2)
说明
- 如果原始数据存在缺失的小时段,结果数组对应位置会是
nan,可根据需求用np.nanfill或统计值填充 - 示例中2022-04-04的00:00-02:00没有数据,所以结果数组的0-2行第一列会是
nan
内容的提问来源于stack exchange,提问作者yeong nam tan
相关产品推荐
相关产品推荐

