将每小时数据重新采样为每日数据并在 python 中的特定列上求和
Posted
技术标签:
【中文标题】将每小时数据重新采样为每日数据并在 python 中的特定列上求和【英文标题】:Resampling hourly data to daily data and summing over a specific column in python 【发布时间】:2021-10-30 00:41:49 【问题描述】:我有图像1 中提到的格式的数据,其中提到了每小时消耗率。 我想每天汇总 Consumption rate 列的值,即将每小时数据转换为每日数据。
使用 Python 的 data.resample('D').sum()
将对所有数字列求和,但我只想对 消耗率 列求和并合并其他列,以便最终输出看起来像图像 2。
如何使用 Python 做到这一点?
【问题讨论】:
能否请您将示例添加为文本 - 复制和粘贴比 OCR 更好...这将有助于得出更有意义的答案。 @MrFuppes 由于字符限制,我无法将示例添加为文本。有没有其他方法可以做到这一点? 您不必添加整个数据集,只需添加一个minimal reproducible example。另见How to make good reproducible pandas examples。关于你的问题,你在找Pandas df.resample with column-specific aggregation function吗? 【参考方案1】:我根据您的问题创建了一个可重现的示例,并使用 Pandas 内置的 groupby()
、resample()
和算术函数来获得所需的输出。
import pandas as pd
# Generate columns as per example
CustomerID = [152] * 7 + [159] * 6 + [162] * 3
ProductID = ['ABC'] * len(CustomerID)
TankID = ['xyz'] * len(CustomerID)
ConsumptionDateTime = (
pd.to_datetime(['2018-09-11 13:30:00',
'2018-09-11 14:30:00',
'2018-09-11 15:30:00',
'2018-09-11 21:30:00',
'2018-09-12 00:30:00',
'2018-09-12 18:30:00',
'2018-09-11 19:30:00'])
)
ConsumptionDateTime = (
ConsumptionDateTime
.append(
pd.date_range(start='2018-09-11 20:30:00',
end='2018-09-12 04:30:00',
freq='H')
)
)
ConsumptionEndTime = (
pd.to_datetime(['2018-09-11 14:30:00',
'2018-09-11 15:30:00',
'2018-09-11 21:30:00',
'2018-09-11 23:30:00',
'2018-09-12 18:30:00',
'2018-09-12 19:30:00',
'2018-09-11 22:30:00'])
)
ConsumptionEndTime = (
ConsumptionEndTime
.append(
ConsumptionDateTime[7:] + pd.Timedelta(1, unit='H')
)
)
ConsumptionRate = [0, 0, 25, 4, 29, 1, 0, 0, 4, 7, 5, 99, 41, 4, 0, 0]
# Create Pandas DataFrame
data = pd.DataFrame('CustomerID': CustomerID,
'ProductID': ProductID,
'TankID': TankID,
'ConsumptionDateTime': ConsumptionDateTime,
'ConsumptionEndTime': ConsumptionEndTime,
'ConsumptionRate': ConsumptionRate)
# Set DateTimeIndex to enable resampling
data.set_index('ConsumptionDateTime', drop=False, inplace=True)
# Group data
grouped_data = data.groupby(['CustomerID', 'ProductID', 'TankID']).resample('D')
# Apply calculations and concatenate results in a single output
final_data = pd.concat([grouped_data['ConsumptionEndTime'].min().dt.date,
grouped_data['ConsumptionRate'].sum()],
axis=1)
请注意,在将数据从 ~hourly 重新采样到每天之前,我已将 ConsumptionDateTime 设置为 DataFrame 索引。
生成的 DataFrame 如下所示:
ConsumptionEndTime ConsumptionRate
CustomerID ProductID TankID ConsumptionDateTime
152 ABC xyz 2018-09-11 2018-09-11 29
2018-09-12 2018-09-12 30
159 ABC xyz 2018-09-11 2018-09-11 16
2018-09-12 2018-09-12 140
162 ABC xyz 2018-09-12 2018-09-12 4
【讨论】:
以上是关于将每小时数据重新采样为每日数据并在 python 中的特定列上求和的主要内容,如果未能解决你的问题,请参考以下文章