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

Ban*_*ngo 5 python datetime dataframe pandas

我想更改与我所拥有的每月第一天相关的值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
                ...
Run Code Online (Sandbox Code Playgroud)

我想更改与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
                ...
Run Code Online (Sandbox Code Playgroud)

快到了,但我正在努力继续前进。

我想要做的是将每年每月第一天相关的值设置为 1。

series[m_ret.index.is_month_start] = 1很接近,但这里的问题是is_month_start仅选择日期值为 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
                ...
Run Code Online (Sandbox Code Playgroud)

我完全被难住了。一如既往,非常感谢您的帮助!谢谢。

DSM*_*DSM 4

一种方法是使用您的.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
Run Code Online (Sandbox Code Playgroud)