如何按小时聚合数据?

How do I aggregate data by hour?

所以我目前正在处理一个数据集,这样我就可以训练一个模型来预测入住率。我想按小时分解数据集,因此每 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   

我确定之前可能已经回答过这个问题,但我找不到任何东西...我正在寻找绘制此数据的图表。

本质上,您将使用 pd.to_datetimeDate 列转换为日期时间对象,然后在使用 [=17] 将 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

你需要的工具是松下重采样方法。

要使用它,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