【问题标题】:Start increment column at begining of month在月初开始增量列
【发布时间】:2015-03-02 19:42:22
【问题描述】:

提前感谢您的帮助。

希望在月份发生变化时将“计数器”设置为 1,并递增 1 直到月份再次发生变化,然后重复。像这样:

                     A          Month Counter
        2015-10-30  -1.478066   10    21
        2015-10-31  -1.562437   10    22
        2015-11-01  -0.292285   11    1
        2015-11-02  -1.581140   11    2
        2015-11-03  0.603113    11    3
        2015-11-04  -0.543563   11    4

In [1]: import pandas as pd
          import numpy as np

In [2]: dates = pd.date_range('20151030',periods=6)

In [3]: df =pd.DataFrame(np.random.randn(6,1),index=dates,columns=list('A'))

In [4]: df
Out[4]:             A
        2015-10-30  -1.478066
        2015-10-31  -1.562437
        2015-11-01  -0.292285
        2015-11-02  -1.581140
        2015-11-03  0.603113
        2015-11-04  -0.543563

试过了,实际月份整数加1:

In [5]: df['Month'] = df.index.month

In [6]: df['Counter'] df['Counter']=np.where(df['Month'] <> df['Month'], (1), (df['Month'].shift()+1))

In [7]: df
Out[7]:  A                     Month Counter
        2015-10-30  -1.478066   10  NaN
        2015-10-31  -1.562437   10  11
        2015-11-01  -0.292285   11  11
        2015-11-02  -1.581140   11  12
        2015-11-03  0.603113    11  12
        2015-11-04  -0.543563   11  12

试过日期时间,越来越近了:

In[8]:  from datetime import timedelta

In[9]:  df['Counter'] = df.index + timedelta(days=1)
Out[9]:     A                      Month    Counter
            2015-10-30  -0.478066   11  2015-10-31
            2015-10-31  -1.562437   10  2015-11-01
            2015-11-01  -0.292285   11  2015-11-02
            2015-11-02  -1.581140   11  2015-11-03
            2015-11-03  0.603113    11  2015-11-04
            2015-11-04  -0.543563   11  2015-11-05

后者给我日期,但不是我的柜台。新的python,所以任何帮助表示赞赏。谢谢!

编辑,将 df 扩展到 period=300 以包含超过 12 个月的数据:

In[10]: dates = pd.date_range('19971002',periods=300)
In[11]: df=pd.DataFrame(np.random.randn(300,1),index=dates,columns=list('A'))
In[12]: df['Counter'] = df.groupby(df.index.month).cumcount()+1
In[13]: df.head()
Out[13]             A          Counter
        1997-09-29  -0.875468   20
        1997-09-30   1.498145   21
        1997-10-02   0.141262   1
        1997-10-03   0.581974   2
        1997-10-04   0.581974   3

In[14]: df[250:]
Out[14]             A          Counter
        1998-09-29  -0.875468   20
        1998-09-30   1.498145   21
        1998-10-01   0.141262   24
        1998-10-02   0.581974   25

期望的结果:

Out[13]             A          Counter
        1997-09-29  -0.875468   20
        1997-09-30   1.498145   21
        1997-10-02   0.141262   1
        1997-10-03   0.581974   2
        1997-10-04   0.581974   3

代码工作正常(上面的 Out[13]),似乎一旦数据超过 12 个月,计数器就会继续增加 +1 而不是设置回 1(上面的 [Out 14]。此外,这里变得棘手,随机日期生成器包括周末,我的数据只有工作日数据。希望能帮到你更好地帮助我。谢谢!

【问题讨论】:

  • 您想要的输出与您的输入不一致。 dates1997-10-02 开始,但所需输出的日期从 1997-09-29 开始。
  • 你确定df['Counter'] = df.groupby([df.index.year, df.index.month]).cumcount()+1 不是你要找的吗?

标签: python datetime pandas counter timedelta


【解决方案1】:

您可以使用groupby/cumcount 为每个组分配累积计数:

import pandas as pd
import numpy as np

N = 300
dates = pd.date_range('19971002', periods=N, freq='B')
df = pd.DataFrame(np.random.randn(N, 1),index=dates,columns=list('A'))
df['Counter'] = df.groupby([df.index.year, df.index.month]).cumcount()+1
print(df.loc['1998-09-25':'1998-10-05'])

产量

                   A  Counter
1998-09-25 -0.511721       19
1998-09-28  1.912757       20
1998-09-29 -0.988309       21
1998-09-30  1.277888       22
1998-10-01 -0.579450        1
1998-10-02 -2.486014        2
1998-10-05  0.728789        3

【讨论】:

  • 谢谢。完美运行 12 个月,然后计数器在第 13 个月从 21 跳到 24(而不是 1),第 14 个月的第一天依次设置为 20。计数器数量在数据集结束时变得非常大。再次感谢,比以往任何时候都更接近,建议?
  • 您的意思是您希望同时按年和月分组吗?在这种情况下使用df.groupby(df.index.year, df.index.month).cumcount()+1
  • 仅按月,您发布的代码在前 12 个实例月份更改时工作正常,但是在第 13 个月,计数器设置为 24,第 13 个月的第二天计数器递增 1 到 25,并且对于其余数据集。有超过 12 年的数据。建议?再次感谢!
  • 你能发布显示问题和期望结果的数据吗?我什至不明白您所说的“第 13 个月”是什么意思,df.index.month 只返回 1 到 12 之间的数字,并且您说您不想按年和月分组。
  • 完美!谢谢!
猜你喜欢
  • 2015-01-14
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
相关资源
最近更新 更多