Pandas DataFrame中每月记录的平均每日计数

mar*_*ion 6 python timestamp time-series pandas

我有一个带有TIMESTAMP列的pandas DataFrame ,它是datetime64数据类型.请记住,最初此列未设置为索引; 索引只是常规整数,前几行看起来像这样:

     TIMESTAMP                  TYPE
0    2014-07-25 11:50:30.640    2
1    2014-07-25 11:50:46.160    3
2    2014-07-25 11:50:57.370    2
Run Code Online (Sandbox Code Playgroud)

每天有任意数量的记录,可能有几天没有数据.我想要得到的是每月平均每日记录数,然后将其绘制为条形图,在x轴上有几个月(2014年4月,2014年5月......等).我设法使用下面的代码计算这些值

dfWIM.index = dfWIM.TIMESTAMP    
for i in range(dfWIM.TIMESTAMP.dt.year.min(),dfWIM.TIMESTAMP.dt.year.max()+1):
    for j in range(1,13):
        print dfWIM[(dfWIM.TIMESTAMP.dt.year == i) & (dfWIM.TIMESTAMP.dt.month == j)].resample('D', how='count').TIMESTAMP.mean()
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

nan
nan
3100.14285714
6746.7037037
9716.42857143
10318.5806452
9395.56666667
9883.64516129
8766.03225806
9297.78571429
10039.6774194
nan
nan
nan
Run Code Online (Sandbox Code Playgroud)

这是可以的,并且通过更多工作,我可以映射到结果以更正月份名称,然后绘制条形图.但是,我不确定这是否是正确/最好的方式,我怀疑可能有一种更简单的方法来使用Pandas获得结果.

我很高兴听到你的想法.谢谢!

注意:如果我没有将TIMESTAMP列设置为索引,我会得到"还原操作"意味着"此dtype不允许"错误.

jak*_*vdp 10

我想你要做两轮groupby,首先按天分组并计算实例,然后按月分组并计算每日计数的平均值.你可以这样做.

首先,我将生成一些看起来像你的假数据:

import pandas as pd

# make 1000 random times throughout the year
N = 1000
times = pd.date_range('2014', '2015', freq='min')
ind = np.random.permutation(np.arange(len(times)))[:N]

data = pd.DataFrame({'TIMESTAMP': times[ind],
                     'TYPE': np.random.randint(0, 10, N)})
data.head()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我将使用两个groupbys pd.TimeGrouper并绘制月平均计数:

import seaborn as sns  # for nice plot styles (optional)

daily = data.set_index('TIMESTAMP').groupby(pd.TimeGrouper(freq='D'))['TYPE'].count()
monthly = daily.groupby(pd.TimeGrouper(freq='M')).mean()
ax = monthly.plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

沿x轴的格式有所不足,但如果需要,你可以调整一下.