我有一个pandas数据系列,其中包含一系列的累积每日回报:
Date CumReturn
3/31/2017 1
4/3/2017 .99
4/4/2017 .992
... ...
4/28/2017 1.012
5/1/2017 1.011
... ...
5/31/2017 1.022
... ...
6/30/2017 1.033
... ...
我只想要月末值。
Date CumReturn
4/28/2017 1.012
5/31/2017 1.022
6/30/2017 1.033
因为我只想要月末值,所以重新采样不会有效,因为它会聚合临时值。
只获得原始数据框中出现的月末值的最简单方法是什么?
答案 0 :(得分:2)
使用is_month_end
的.dt
date accessor组件:
# Ensure the date column is a Timestamp
df['Date'] = pd.to_datetime(df['Date'])
# Filter to end of the month only
df = df[df['Date'].dt.is_month_end]
将此应用于您提供的数据:
Date CumReturn
0 2017-03-31 1.000
5 2017-05-31 1.022
6 2017-06-30 1.033
修改强>
要获得营业月末,请使用BMonthEnd(0)
进行比较:
from pandas.tseries.offsets import BMonthEnd
# Ensure the date column is a Timestamp
df['Date'] = pd.to_datetime(df['Date'])
# Filter to end of the month only
df = df[df['Date'] == df['Date'] + BMonthEnd(0)]
将此应用于您提供的数据:
Date CumReturn
0 2017-03-31 1.000
3 2017-04-28 1.012
5 2017-05-31 1.022
6 2017-06-30 1.033
答案 1 :(得分:2)
df.sort_values('Date').groupby([df.Date.dt.year,df.Date.dt.month]).last()
Out[197]:
Date CumReturn
Date Date
2017 3 2017-03-31 1.000
4 2017-04-28 1.012
5 2017-05-31 1.022
6 2017-06-30 1.033
答案 2 :(得分:1)
假设数据框已经按照'日期'排序。并且该列中的值是Pandas时间戳,您可以将它们转换为YYYY-mm字符串值进行分组并获取最后一个值:
df.groupby(df['Date'].dt.strftime('%Y-%m'))['CumReturn'].last()
# Example output:
# 2017-01 0.127002
# 2017-02 0.046894
# 2017-03 0.005560
# 2017-04 0.150368