Python Pandas:更改与每个月的第一天条目相关联的值

时间:2017-07-13 00:07:14

标签: python pandas datetime dataframe

我想更改与pandas.Series每个月的第一天相关联的值。例如,给出这样的东西:

Date
1984-01-03    0.992701
1984-01-04    1.003614
1984-01-17    0.994647
1984-01-18    1.007440
1984-01-27    1.006097
1984-01-30    0.991546
1984-01-31    1.002928
1984-02-01    1.009894
1984-02-02    0.996608
1984-02-03    0.996595
                ...

我想更改与1984-01-031984-02-01等相关联的值。我已经在这个问题上绞了好几个小时,并且已经看了很多Stack Overflow。一些解决方案已接近尾声。例如,使用:

[In]: series.groupby((m_ret.index.year, m_ret.index.month)).first()

[Out]:

Date  Date
1984  1       0.992701
      2       1.009894
      3       1.005963
      4       0.997899
      5       1.000342
      6       0.995429
      7       0.994620
      8       1.019377
      9       0.993209
      10      1.000992
      11      1.009786
      12      0.999069
1985  1       0.981220
      2       1.011928
      3       0.993042
      4       1.015153
                ...

几乎就在那里,但我很难继续前进。

我要做的是将每个月的第一天与每年相关的值设置为1.

series[m_ret.index.is_month_start] = 1接近,但问题是is_month_start只选择日值为1的行。但在我的系列中,并不总是这样,你可以看到。例如,1月第一天的日期为1984-01-03

series.groupby(pd.TimeGrouper('BM')).nth(0)似乎也没有返回第一天,而是在最后一天:

Date
1984-01-31    0.992701
1984-02-29    1.009894
1984-03-30    1.005963
1984-04-30    0.997899
1984-05-31    1.000342
1984-06-29    0.995429
1984-07-31    0.994620
1984-08-31    1.019377
                ...

我完全难过了。我们的帮助一如既往,非常感谢!谢谢。

1 个答案:

答案 0 :(得分:3)

一种方法是使用您的.groupby((m_ret.index.year, m_ret.index.month))提示,但使用idxmin代替索引本身转换为系列:

In [74]: s.index.to_series().groupby([s.index.year, s.index.month]).idxmin()
Out[74]: 
Date  Date
1984  1      1984-01-03
      2      1984-02-01
Name: Date, dtype: datetime64[ns]

In [75]: start = s.index.to_series().groupby([s.index.year, s.index.month]).idxmin()

In [76]: s.loc[start] = 999

In [77]: s
Out[77]: 
Date
1984-01-03    999.000000
1984-01-04      1.003614
1984-01-17      0.994647
1984-01-18      1.007440
1984-01-27      1.006097
1984-01-30      0.991546
1984-01-31      1.002928
1984-02-01    999.000000
1984-02-02      0.996608
1984-02-03      0.996595
dtype: float64