使用 Python,如何按小时对 Dataframe 中的列进行分组?

Posted

技术标签:

【中文标题】使用 Python,如何按小时对 Dataframe 中的列进行分组?【英文标题】:using Python, How to group a column in Dataframe by the hour? 【发布时间】:2017-01-01 06:01:15 【问题描述】:

我有一个 python 数据框 (df1),它有一个列时间。我使用pd.to_datetime(df1['time']) 将该列转换为日期时间序列。现在我得到一个这样的列:

2016-08-24 00:00:00  2016-08-13  00:00:00   
2016-08-24 00:00:00  2016-08-13  00:00:00     
2016-08-24 00:00:00  2016-08-13  00:00:00   
2016-08-24 00:00:00  2016-08-13  00:00:00  
2016-08-24 00:00:01  2016-08-13  00:00:01   
2016-08-24 00:00:01  2016-08-13  00:00:01   
2016-08-24 00:00:02  2016-08-13  00:00:02  
2016-08-24 00:00:02  2016-08-13  00:00:02     
2016-08-24 00:00:02  2016-08-13  00:00:02    
2016-08-24 00:00:02  2016-08-13  00:00:02     
2016-08-24 00:00:02  2016-08-13  00:00:02     
2016-08-24 00:00:02  2016-08-13  00:00:02     
2016-08-24 00:00:02  2016-08-13  00:00:02    
2016-08-24 00:00:02  2016-08-13  00:00:02    
2016-08-24 00:00:02  2016-08-13  00:00:02     
....

2016-08-24 23:59:59  2016-08-13  00:00:02  

基本上,我希望第一列按小时分组,这样我就可以看到 1 小时内有多少条目。任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

使用@jezrael 设置。

df.resample(rule='H', how='count').rename(columns = 'time':'count')

                      count
2016-08-24 00:00:00      1
2016-08-24 01:00:00      3
2016-08-24 02:00:00      1

【讨论】:

是的,如果我将 groupby 用于单个列,则此方法有效。你知道当我们使用多列分组时会发生什么吗?【参考方案2】:

使用resample:

#pandas version 0.18.0 and higher
df = df.resample('H').size()

#pandas version below 0.18.0
#df = df.resample('H', 'size')

print (df)
2016-08-24 00:00:00    1
2016-08-24 01:00:00    3
2016-08-24 02:00:00    1
Freq: H, dtype: int64

如果需要输出为DataFrame:

df = df.resample('H').size().rename('count').to_frame()
print (df)
                     count
2016-08-24 00:00:00      1
2016-08-24 01:00:00      3
2016-08-24 02:00:00      1

或者您可以通过转换为 <M8[h] 然后聚合 size 来从 DatetimeIndex minutesseconds 中删除:

import pandas as pd

df = pd.DataFrame('time': pd.Timestamp('2016-08-24 01:00:00'): pd.Timestamp('2016-08-13 00:00:00'), pd.Timestamp('2016-08-24 01:00:01'): pd.Timestamp('2016-08-13 00:00:01'), pd.Timestamp('2016-08-24 01:00:02'): pd.Timestamp('2016-08-13 00:00:02'), pd.Timestamp('2016-08-24 02:00:02'): pd.Timestamp('2016-08-13 00:00:02'), pd.Timestamp('2016-08-24 00:00:00'): pd.Timestamp('2016-08-13 00:00:00'))
print (df)
                                   time
2016-08-24 00:00:00 2016-08-13 00:00:00
2016-08-24 01:00:00 2016-08-13 00:00:00
2016-08-24 01:00:01 2016-08-13 00:00:01
2016-08-24 01:00:02 2016-08-13 00:00:02
2016-08-24 02:00:02 2016-08-13 00:00:02

df= df.groupby([df.index.values.astype('<M8[h]')]).size()
print (df)
2016-08-24 00:00:00    1
2016-08-24 01:00:00    3
2016-08-24 02:00:00    1
dtype: int64

【讨论】:

我的问题是我有多个列分组。我的代码目前是 df2 = df1['count'].groupby([df1['sc-status],df1[cs-method],df1[time]).count() 使用上面的代码,并使用我当前的数据,我得到了输入文件中的时间(每小时随机请求)。我正在努力进行下一步,即每小时对这个分组对象(df2)进行分组。希望这是有道理的【参考方案3】:

您可以使用pandas.DatetimeIndex,如下所示。

import numpy as np
import pandas as pd

# An example of time period
drange = pd.date_range('2016-08-01 00:00:00', '2016-09-01 00:00:00',
                       freq='10min')

N = len(drange)

# The number of columns without 'time' is three.
df = pd.DataFrame(np.random.rand(N, 3))
df['time'] = drange

time_col = pd.DatetimeIndex(df['time'])

gb = df.groupby([time_col.year,
                 time_col.month,
                 time_col.day,
                 time_col.hour])

for col_name, gr in gb:
    print(gr)  # If you want to see only the length, use print(len(gr))

[参考文献] Python Pandas: Group datetime column into hour and minute aggregations

【讨论】:

嗨@Daewon lee....谢谢你的回答。当我使用这段代码时,它会抛出一个错误,说 Series 对象没有小时值。有什么想法吗? @Vijay 您使用哪个版本的 Python?上述代码已在 Windows 10 64 位的 Anaconda Python 3.5(64 位)中进行了测试。 (你用的是哪个版本的 Pandas?我的是 0.18.1)

以上是关于使用 Python,如何按小时对 Dataframe 中的列进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django 查询集按小时对对象进行分组?

如何使用带有 Pandas 的时间戳按小时对数据帧进行分组

如何按小时对 HKStatistics 进行分组?

Python数据分析之Pandas

Python数据分析之Pandas

如何按特定日期范围(例如小时、日、月)对数据进行分组?