如何按小时汇总数据?
Posted
技术标签:
【中文标题】如何按小时汇总数据?【英文标题】:How do I aggregate data by hour? 【发布时间】:2021-12-15 17:56:15 【问题描述】:所以我目前正在处理一个数据集,以便我可以训练一个模型来预测入住率。我想按小时分解数据集,因此每 60 分钟聚合一次数据以获得每小时或半小时的平均值,以便在绘图时更容易阅读。我该怎么做?
Date Temperature Humidity Light CO2
1 2015-02-04 17:51:00 1.000000 0.470533 0.275490 0.190933
2 2015-02-04 17:51:59 0.992823 0.470332 0.277754 0.186446
3 2015-02-04 17:53:00 0.992823 0.469326 0.275490 0.186136
4 2015-02-04 17:54:00 0.992823 0.467315 0.275490 0.182887
5 2015-02-04 17:55:00 0.980861 0.467315 0.275490 0.180566
6 2015-02-04 17:55:59 0.980861 0.467315 0.270964 0.178400
7 2015-02-04 17:57:00 0.980861 0.467315 0.270964 0.178813
8 2015-02-04 17:57:59 0.980861 0.467315 0.270964 0.177162
9 2015-02-04 17:58:59 0.980861 0.467315 0.270964 0.171180
10 2015-02-04 18:00:00 0.974880 0.466197 0.270964 0.170354
11 2015-02-04 18:01:00 0.974880 0.465080 0.270964 0.171747
12 2015-02-04 18:02:00 0.980861 0.462845 0.270964 0.172211
13 2015-02-04 18:03:00 0.980861 0.465825 0.270964 0.167569
14 2015-02-04 18:04:00 0.968900 0.465080 0.270964 0.170045
15 2015-02-04 18:04:59 0.956938 0.463962 0.270964 0.169117
16 2015-02-04 18:06:00 0.956938 0.463962 0.270640 0.165713
17 2015-02-04 18:07:00 0.956938 0.467315 0.000000 0.166331
18 2015-02-04 18:08:00 0.943780 0.471338 0.000000 0.168498
19 2015-02-04 18:08:59 0.943780 0.475807 0.000000 0.168498
20 2015-02-04 18:10:00 0.930622 0.475807 0.000000 0.170973
我确定这可能以前已经回答过,但我找不到任何东西...我正在寻找绘制这些数据。
【问题讨论】:
专业提示:如果您print(train.head())
,您可以复制和粘贴文本而不是显示屏幕截图,这样我们就可以更轻松地加载数据以获取答案。
这能回答你的问题吗? Python Pandas: Group datetime column into hour and minute aggregations
如果您需要帮助将 DataFrame 的一个小样本格式化为可复制的代码片段,请参阅How to make good reproducible pandas examples。
【参考方案1】:
你需要的工具是松下resample方法。
要使用它,Date 列必须是 datetime 类型,所以如果保留它 作为文本,从:
df.Date = pd.to_datetime(df.Date)
要计算重新采样的 DataFrame,请运行:
result = df.resample('30T', on="Date").mean()
在上面的例子中 30T 是重采样频率 - 30 分钟。 如果您改变主意,请设置另一个值。
您的源数据样本的结果是:
Temperature Humidity Light CO2
Date
2015-02-04 17:30:00 0.986975 0.468231 0.273730 0.181391
2015-02-04 18:00:00 0.960853 0.467565 0.172402 0.169187
【讨论】:
这太完美了,非常感谢! @Valdi_Bo【参考方案2】:基本上,您将使用pd.to_datetime
将Date
列转换为日期时间对象,然后在将Date
列设置为索引后使用简单的df.groupby
df.groupby([df.index.hour]).mean()
这是一个完整的例子:
import pandas as pd
from io import StringIO
data = """Date Temperature Humidity Light CO2
2015-02-04 17:51:00 1.000000 0.470533 0.275490 0.190933
2015-02-04 17:51:59 0.992823 0.470332 0.277754 0.186446
2015-02-04 17:53:00 0.992823 0.469326 0.275490 0.186136
2015-02-04 17:54:00 0.992823 0.467315 0.275490 0.182887
2015-02-04 17:55:00 0.980861 0.467315 0.275490 0.180566
2015-02-04 17:55:59 0.980861 0.467315 0.270964 0.178400
2015-02-04 17:57:00 0.980861 0.467315 0.270964 0.178813
2015-02-04 17:57:59 0.980861 0.467315 0.270964 0.177162
2015-02-04 17:58:59 0.980861 0.467315 0.270964 0.171180
2015-02-04 18:00:00 0.974880 0.466197 0.270964 0.170354
2015-02-04 18:01:00 0.974880 0.465080 0.270964 0.171747
2015-02-04 18:02:00 0.980861 0.462845 0.270964 0.172211
2015-02-04 18:03:00 0.980861 0.465825 0.270964 0.167569
2015-02-04 18:04:00 0.968900 0.465080 0.270964 0.170045
2015-02-04 18:04:59 0.956938 0.463962 0.270964 0.169117
2015-02-04 18:06:00 0.956938 0.463962 0.270640 0.165713
2015-02-04 18:07:00 0.956938 0.467315 0.000000 0.166331
2015-02-04 18:08:00 0.943780 0.471338 0.000000 0.168498
2015-02-04 18:08:59 0.943780 0.475807 0.000000 0.168498
2015-02-04 18:10:00 0.930622 0.475807 0.000000 0.170973
"""
df = pd.read_csv(StringIO(data), sep="\s\s+")
df = df.set_index("Date")
df.index = pd.to_datetime(df.index)
print(df.groupby([df.index.hour]).mean())
Temperature Humidity Light CO2
Date
17 0.986975 0.468231 0.273730 0.181391
18 0.960853 0.467565 0.172402 0.169187
【讨论】:
以上是关于如何按小时汇总数据?的主要内容,如果未能解决你的问题,请参考以下文章