没有重采样的时间序列的熊猫子集

时间:2018-01-05 21:15:25

标签: python pandas

我有一个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

因为我只想要月末值,所以重新采样不会有效,因为它会聚合临时值。

只获得原始数据框中出现的月末值的最简单方法是什么?

3 个答案:

答案 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