熊猫数据透视表和按月和小时分组

时间:2018-10-18 09:21:06

标签: pandas group-by pivot-table pandas-groupby python-datetime

我有以下格式的数据:Screenshot of dataframe

我必须每月为每个区域(北,南,中)每小时创建一次id计数的条形图。例如,我必须在1月至12月的几个月内绘制“北方”每小时ID计数的12个独立条形图

import numpy as np
from datetime import time,datetime,timedelta
df.Datetime = pd.to_datetime(Datetime) 
df.groupby('AREA')
North = df.get_group('North')
Middle = df.get_group('Middle')
South = df.get_group('South') 
North = pd.pivot_table(North,index='Datetime', values='id', aggfunc=[np.sum])

我被困住了,不确定如何继续。我正在考虑做类似'North.groupby(pd.Grouper(key ='Datetime',freq ='H'))''的操作,但是由于我已经为日期时间建立索引,所以它不起作用。如何从“北方”数据框按月和小时分组?

感谢任何人都可以提供帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

df = pandas.DataFrame([
['2017-01-10 08:40:00', 1, 'North'],
['2017-01-10 08:30:00', 1, 'North'],
['2017-01-10 08:40:00', 1, 'North'],
['2017-01-10 15:40:00', 2, 'North'],
['2017-01-10 07:30:00', 2, 'North'],
['2017-01-10 08:40:00', 3, 'North'],
['2017-01-10 08:40:00', 1, 'Middle'],
['2017-01-10 08:30:00', 1, 'Middle'],
['2017-01-10 08:40:00', 1, 'Middle'],
['2017-01-11 16:40:00', 2, 'South'],
['2017-01-11 08:30:00', 2, 'South'],
['2017-01-11 07:40:00', 3, 'South'],
['2017-01-10 08:40:00', 2, 'South'],
['2017-01-10 08:40:00', 2, 'South'],
['2017-01-10 08:40:00', 3, 'South'],
['2017-01-10 08:40:00', 1, 'South']], columns=['Datetime', 'id', 'Area'])

您需要解析日期时间,然后创建另外两个包含时间和日期的列。 这取决于您将执行多少数据分析,如果您将在不同日期的给定时间进行分析,这可能是一个好方法:

df['Datetime'] = [datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') for x in df['Datetime'].tolist()]
df['Date'] = [x.strftime('%Y-%m-%d') for x in df['Datetime'].tolist()]
df['Time'] = ['%s:00' % x.strftime('%H') for x in df['Datetime'].tolist()]

然后,您只需分组并拆开数据框

df_1 = df.groupby(['Date', 'Time', 'id', 'Area']).count().unstack(['Area', 'id'])

最后您绘制数据

df_1.plot(kind='bar')

enter image description here

答案 1 :(得分:0)

对于不同的ID计数:

Data ['Month'] = Data ['Datetime']。apply(lambda x:x.month)

Data ['Hour'] = Data ['Datetime']。apply(lambda x:x.hour)

Data = pd.DataFrame({'count':Data.groupby([“ Month”,“ Hour”,“ Area”])[“ id”]。nunique()})。reset_index()