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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:33:44