如何按小时汇总数据?

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_datetimeDate 列转换为日期时间对象,然后在将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

【讨论】:

以上是关于如何按小时汇总数据?的主要内容,如果未能解决你的问题,请参考以下文章

Graphite如何根据选定的间隔进行汇总

linq 里按月查询汇总

如何按组汇总数据,通过创建虚拟变量作为折叠方法

用分类汇总,实现分页打印

如何把EXCEL表中的数据进行按多个条件进行分类汇总,并统计出个数,并求和?

如何按“熊猫”中的列获取缺失/NaN 数据的汇总计数?