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

Posted

技术标签:

【中文标题】Pandas DataFrame 中每月平均每日记录数【英文标题】:Average of daily count of records per month in a Pandas DataFrame 【发布时间】:2016-01-25 19:49:11 【问题描述】:

我有一个带有 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

每天有任意数量的记录,并且可能有几天没有数据。我想要得到的是每月平均每日记录数,然后将其绘制为条形图,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()

给出以下输出:

nan
nan
3100.14285714
6746.7037037
9716.42857143
10318.5806452
9395.56666667
9883.64516129
8766.03225806
9297.78571429
10039.6774194
nan
nan
nan

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

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

注意:如果我没有将 TIMESTAMP 列设置为索引,我会收到“reduction operation 'mean' not allowed for this dtype”错误。

【问题讨论】:

【参考方案1】:

我认为您需要进行两轮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()

现在我将使用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')

沿 x 轴的格式有一些不足之处,但您可以根据需要进行调整。

【讨论】:

我无法弄清楚如何使用groupby 来做到这一点。原来TimeGrouper 是诀窍。非常感谢! 对带有时间序列的条形图的 x 轴进行格式化比我想象的要复杂得多。如果有人卡在同一点,解决方案是***.com/questions/33642388/…。

以上是关于Pandas DataFrame 中每月平均每日记录数的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动平均值(rolling mean)例如,计算某公司的多个店铺每N天(5天)的滚动销售额平均值

在 Pandas 数据框中查找每三列的平均值

根据 Pandas DataFrame 中每个项目的开始和结束日期计算每月活动的项目数

根据日期创建每月重新采样的 Pandas DataFrame

Pandas 在日期列上重新采样

pandas将dataframe日期数据列的日期转化为日期当月第一天(每月1号)的日期并生成新的数据列(Setting date to beginning of month in dataframe)