pandas dataframe groupby datetime month

时间:2014-06-06 13:15:42

标签: python pandas datetime pandas-groupby

考虑一个csv文件:

string,date,number
a string,2/5/11 9:16am,1.0
a string,3/5/11 10:44pm,2.0
a string,4/22/11 12:07pm,3.0
a string,4/22/11 12:10pm,4.0
a string,4/29/11 11:59am,1.0
a string,5/2/11 1:41pm,2.0
a string,5/2/11 2:02pm,3.0
a string,5/2/11 2:56pm,4.0
a string,5/2/11 3:00pm,5.0
a string,5/2/14 3:02pm,6.0
a string,5/2/14 3:18pm,7.0

我可以阅读此内容,并将日期列重新格式化为日期时间格式:

b=pd.read_csv('b.dat')
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p')

我一直在尝试按月对数据进行分组。似乎应该有一种明显的方式来访问月份和分组。但我似乎无法做到这一点。有谁知道怎么做?

我目前正在尝试按日期重新编制索引:

b.index=b['date']

我可以这样访问这个月:

b.index.month

但是我似乎无法找到一个按月混在一起的功能。

5 个答案:

答案 0 :(得分:117)

管理:

df.groupby(by=[b.index.month, b.index.year])

df.groupby(pd.Grouper(freq='M'))  # update for v0.21+

答案 1 :(得分:43)

(更新:2018年)

请注意,pd.Timegrouper已弃用,将被删除。改为使用:

 df.groupby(pd.Grouper(freq='M'))

答案 2 :(得分:3)

避免MultiIndex的一个解决方案是创建新的datetime列设置day = 1.然后按此列分组。以下是一些简单的例子。

df = pd.DataFrame({'Date': pd.to_datetime(['2017-10-05', '2017-10-20']),
                   'Values': [5, 10]})

# normalize day to beginning of month
df['YearMonth'] = df['Date'] + pd.offsets.MonthBegin(1)

# two alternative methods
df['YearMonth'] = df['Date'] - pd.to_timedelta(df['Date'].dt.day-1, unit='D')
df['YearMonth'] = df['Date'].map(lambda dt: dt.replace(day=1))

g = df.groupby('YearMonth')

res = g['Values'].sum()

# YearMonth
# 2017-10-01    15
# Name: Values, dtype: int64

pd.Grouper不同,此解决方案的微妙优势是将石斑鱼指数标准化为每个月的开始而不是结束,因此您可以通过{轻松提取组{ {1}}:

get_group

计算10月的最后一天会稍微麻烦一些。截至v0.23,pd.Grouper支持some_group = g.get_group('2017-10-01') 参数,但这仅适用于convention石斑鱼。

答案 3 :(得分:3)

@jpp的替代解决方案,但输出YearMonth字符串:

df['YearMonth'] = pd.to_datetime(df['Date']).apply(lambda x: '{year}-{month}'.format(year=x.year, month=x.month))

res = df.groupby('YearMonth')['Values'].sum()

答案 4 :(得分:2)

要对时间序列数据进行分组,您可以使用 resample 方法。例如,按月分组:

df.resample(rule='M', on='date')['Values'].sum()

您可以找到 here 的偏移别名列表。