如何用Python Pandas按天分组二维数组并计算每日和?
用Pandas按天分组求和多维数组的最优方案
针对你的需求——按天分组求和每个时间点对应的(3,4)二维数组,同时保持结果的二维数组结构,我整理了几种可行方案,其中利用Pandas向量化聚合的方法效率最高,尤其适合大数据量场景:
方案1:直接GroupBy + Apply(简单但效率一般)
这是最直观的写法,直接按日期分组后对每组内的数组求和:
import numpy as np import pandas as pd from datetime import datetime # 创建模拟数据 data = np.ones((72, 3, 4)) t = pd.date_range(datetime(2008,7,1), freq='1H', periods=72) s = pd.Series([data[i] for i in range(data.shape[0])], index=t) # 按日期分组求和 daily_sum = s.groupby(s.index.date).apply(lambda group: np.sum(group.values, axis=0)) # 查看结果 print(daily_sum)
这种方法逻辑清晰,但apply会逐组执行Python函数,当数据量很大(比如数万小时的时序数据)时,效率会明显下降。
方案2:展平数组 + 向量化聚合(最优方案)
这个方法通过将二维数组展平为一维,利用Pandas内置的resample.sum()向量化操作完成求和,最后再重塑回原二维结构,效率比方案1高得多:
# 1. 将每个(3,4)数组展平为12个元素的一维数组,生成二维DataFrame flat_data = np.array([arr.flatten() for arr in s.values]) df_flat = pd.DataFrame(flat_data, index=t) # 2. 按天求和(Pandas内置的resample.sum是向量化操作,底层用C实现) daily_sum_flat = df_flat.resample('D').sum() # 3. 将每行的12个元素重塑回(3,4)的二维数组 daily_sum = daily_sum_flat.apply(lambda row: row.values.reshape(3,4), axis=1) # 查看结果 print(daily_sum)
核心优势在于resample.sum()是向量化聚合,避免了Python层面的循环,处理大规模数据时速度能提升数倍甚至数十倍。而且这个方法适配任意维度的数组,只需要调整flatten()和reshape()的参数即可。
方案3:纯NumPy分组求和(适合NumPy重度使用者)
如果你更习惯用NumPy操作,也可以直接处理三维数组:
# 将Series的values堆叠成三维数组 arr = np.stack(s.values) # shape: (72, 3, 4) # 获取日期分组标签 dates = t.date unique_dates = np.unique(dates) # 按日期分组求和 daily_sum = pd.Series([np.sum(arr[dates == d], axis=0) for d in unique_dates], index=unique_dates)
这个方法的效率介于方案1和方案2之间,适合已经熟悉NumPy布尔索引的场景,但依然存在Python循环遍历唯一日期的开销。
结果验证
三种方案最终得到的结果一致:每个日期对应一个(3,4)的数组,所有元素值为24(因为每天24小时,每个小时的数组元素都是1,24个1求和得24)。
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

