将每小时数据重新采样为每日数据并在 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 中的特定列上求和的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将 5 分钟数据重新采样为每小时平均值:日期问题 [重复]

每小时重新采样数据帧

将每一天绘制为每小时的时间序列

如何对具有多列的df重新采样

使用 Pandas 将每日数据重新采样为每月(日期格式)

Pandas 中的多索引、多年和每小时数据每天随机采样 N 小时