python时间序列重采样以获得正确的计数

时间:2018-09-26 17:46:11

标签: python pandas dataframe time-series

我有一个4年的每月时间序列(索引是时间戳)。因此,理想情况下,我将有4个1月行,2月2月行,3月4日行,4月4日行..等等。

但是,有时候,我可能会错过一个月或更长时间。因此,我可能有1月4日,2月2日,3月3日,4月4日,5月1日...等等。

我正在尝试对('MS')。count()进行重新采样,但这不起作用,因为它每个月都算作一个月。我如何分组以获取正确的计数,例如; 1月4日,2月2日,3月3日,4月4日,5月1日...等等。然后取平均值?

例如... jan的计数为4,因为我有2行的Jan日期。但是,十月的计数是3 ...因为我有3排婴儿床。一月份售出的苹果平均数为13/4

我正在尝试通过重新采样来做到这一点,而不是通过循环或熊猫切片(如果可能)。

df_= df_monthly.resample('MS').count()

Index       Apples_sold
1-1,2015  3
2-1,2015  5
3-1,2015  6
...
9-1,2015  7
10-1,2015  9
11-1,2015  6
12-1,2015  2
==================
1-1,2016  2
2-1,2016  5
3-1,2016  6
...
9-1,2016  7
10-1,2016  9
11-1,2016  6
12-1,2016  2
==================
1-1,2017  4
2-1,2017  5
3-1,2017  6
...
9-1,2017  7
10-1,2017  9
11-1,2017  6
12-1,2017  2
==================
1-1,2018  4
2-1,2018  5
3-1,2018  6
...
9-1,2018  7

2 个答案:

答案 0 :(得分:0)

您可以在索引值上使用extract和正则表达式来提取月份。

以下是我用作示例的DataFrame:

             count
1 Feb 2018       1
8 Feb 2018       2
1 Mar 2018       3
8 Mar 2018       4
15 Mar 2018      5
1 Apr 2018       6
8 Apr 2018       7
15 Apr 2018      8
22 Apr 2018      9

以及要提取的代码:

month_re = r'(?P<month>[A-Za-z]+)'
months = df.groupby(df.index.str.extract(month_re, expand=False), axis=0)
for month, group in months:
    print(month, group.count())

输出:

Apr count    4
Feb count    2
Mar count    3

您还可以使用sum()来了解每月售出的苹果数量,或者没有。

答案 1 :(得分:0)

我最终做了这样的事情:

  

df.index.month.unique()中的月份:

   df_month_avg = df[df.index.month == month].mean(axis=0, numeric_only=True)

对于count,我只是用count()代替了mean()

这似乎可行……即使我的目标是使用重采样方法……但我找不到重采样分组键来执行此操作。