如何分组时间序列数据

时间:2016-09-16 07:37:08

标签: python pandas

我有一个数据框,B列的dtype是datetime64。

    A      B
0   a   2016-09-13
1   b   2016-09-14
2   b   2016-09-15
3   a   2016-10-13
4   a   2016-10-14

我想根据月份(或一般年份和日期......)进行分组。

所以我想在下面得到计数结果,key = B列。

              a       b
2016-09       1       2
2016-10       2       0

我尝试过groupby。但我无法弄清楚如何处理像datetime64这样的dtypes ... 如何处理和分组dtype datetime64?

2 个答案:

答案 0 :(得分:4)

如果将索引设置为日期时间,则可以使用pd.TimeGrouper按各种时间范围进行排序。示例代码:

  Select '1' as "Test" , (CASE WHEN (True) Then '2' ELSE '3' END) as Two/Three.

返回:

# recreate dataframe
df = pd.DataFrame({'A': ['a', 'b', 'b', 'a', 'a'], 'B': ['2016-09-13', '2016-09-14', '2016-09-15',
                                                        '2016-10-13', '2016-10-14']})
df['B'] = pd.to_datetime(df['B'])

# set column B as index for use of TimeGrouper
df.set_index('B', inplace=True)

# Now do the magic of Ami Tavory's answer combined with timeGrouper:
df = df.groupby([pd.TimeGrouper('M'), 'A']).size().unstack().fillna(0)

或者替代(ayhan的信用)跳过设置索引步骤并在创建数据帧后直接使用以下单行:

A             a    b
B                   
2016-09-30  1.0  2.0
2016-10-31  2.0  0.0

返回相同的答案

答案 1 :(得分:3)

假设您从

开始
In [247]: df = pd.DataFrame({'A': ['a', 'b', 'b', 'a', 'a'], 'B': ['2016-09-13', '2016-09-14', '2016-09-15', '2016-10-13', '2016-10-14']})

In [248]: df.B = pd.to_datetime(df.B)

然后您可以groupby - size,然后unstack

In [249]: df = df.groupby([df.B.dt.year.astype(str) + '-' + df.B.dt.month.astype(str), df.A]).size().unstack().fillna(0).astype(int)

最后,您只需要再次B日期:

In [250]: df.index = pd.to_datetime(df.index)

In [251]: df
Out[251]: 
A           a  b
B               
2016-10-01  2  0
2016-09-01  1  2

请注意,最终转换为日期时间设置为统一日(您不能拥有此类型的“无天花板”对象)。