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-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
...
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)
我完全被难住了。一如既往,非常感谢您的帮助!谢谢。
一种方法是使用您的.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)
| 归档时间: |
|
| 查看次数: |
640 次 |
| 最近记录: |