我想更改与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-03
,1984-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
...
我完全难过了。我们的帮助一如既往,非常感谢!谢谢。
答案 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