熊猫时间序列:按天汇总并转置

时间:2019-03-18 19:06:55

标签: python pandas dataframe aggregate transpose

我有以下数据框:

dataframe = pd.DataFrame({'date':pd.to_datetime(['2018-05-27', '2018-05-27','2018-05-28','2018-06-1']), 
                         'code': ['1', '1', '1', '2']})
dataframe 
    date      code
0   2018-05-27  1
1   2018-05-27  1
2   2018-05-28  1
3   2018-06-01  2

我想要

dataframe = pd.DataFrame({'date':pd.to_datetime(['2018-05-27', '2018-05-28','2018-05-29','2018-05-30','2018-05-31', '2018-06-1']),
                          '1': [2, 1, 1, 0, 0, 0], 
                          '2': [0, 0, 0, 0, 0, 1]})
dataframe
    date        1   2
0   2018-05-27  2   0
1   2018-05-28  1   0
2   2018-05-29  0   0
3   2018-05-30  0   0
4   2018-05-31  0   0
5   2018-06-01  0   1

我的第一次尝试是:

dataframe.groupby([dataframe['code'], dataframe['date'].dt.month.rename('month'), dataframe['date'].dt.day.rename('day')]).agg({"count"})


code    month day    date count
1         5    27       2
               28       1
2         6     1       1

但是给我两个问题:(1)日期不再是日期格式,(2)我不知道如何转置日期。我一直在与熊猫的时间序列和聚合函数作斗争,但收效甚微。我也只想几个月就可以拥有它。对如何进行有任何想法吗?

我已经检查了以下StackOverflow的问题。 Herehere,但不完全相同。

1 个答案:

答案 0 :(得分:3)

您可以使用pd.crosstab

pd.crosstab(dataframe['date'], dataframe['code'])\
  .reindex(pd.date_range(dataframe['date'].min(), 
                         dataframe['date'].max()), fill_value=0)

输出:

code        1  2
2018-05-27  2  0
2018-05-28  1  0
2018-05-29  0  0
2018-05-30  0  0
2018-05-31  0  0
2018-06-01  0  1

选项#2

dataframe.groupby(['date','code']).size()\
         .unstack(1, fill_value=0)\
         .reindex(pd.date_range(dataframe['date'].min(), 
                                dataframe['date'].max()), 
                  fill_value=0)

输出:

code        1  2
2018-05-27  2  0
2018-05-28  1  0
2018-05-29  0  0
2018-05-30  0  0
2018-05-31  0  0
2018-06-01  0  1