我有一个每日数据的数据集.我只需要获取数据集中每个月第一天的数据(数据是从1972年到2013年).因此,例如,我需要提取索引20,日期2013-12-02值0.1555.我遇到的问题是每个月的第一天是不同的,所以我不能使用诸如relativedelta(months = 1)之类的步骤,我将如何从我的数据集中提取这些值?
是否有类似于我在R的另一篇文章中找到的命令? R - XTS:从缺少行的每日时间序列中获取每个月的第一个日期和值
17 2013-12-05 0.1621
18 2013-12-04 0.1698
19 2013-12-03 0.1516
20 2013-12-02 0.1555
21 2013-11-29 0.1480
22 2013-11-27 0.1487
23 2013-11-26 0.1648
我会按月分组,然后得到每组的第0行(第n行).
首先设置为索引(我认为这是必要的):
In [11]: df1 = df.set_index('date')
In [12]: df1
Out[12]:
n val
date
2013-12-05 17 0.1621
2013-12-04 18 0.1698
2013-12-03 19 0.1516
2013-12-02 20 0.1555
2013-11-29 21 0.1480
2013-11-27 22 0.1487
2013-11-26 23 0.1648
Run Code Online (Sandbox Code Playgroud)
接下来的排序,这样第一个元素是该月的第一天(注:这不会出现所必需的第n个,但我认为这实际上是一个错误!):
In [13]: df1.sort_index(inplace=True)
In [14]: df1.groupby(pd.TimeGrouper('M')).nth(0)
Out[14]:
n val
date
2013-11-26 23 0.1648
2013-12-02 20 0.1555
Run Code Online (Sandbox Code Playgroud)
另一个选择是重新取样并取第一个条目:
In [15]: df1.resample('M', 'first')
Out[15]:
n val
date
2013-11-30 23 0.1648
2013-12-31 20 0.1555
Run Code Online (Sandbox Code Playgroud)
考虑到这一点,你可以通过提取月份然后分组来更简单地做到这一点:
In [21]: pd.DatetimeIndex(df.date).to_period('M')
Out[21]:
<class 'pandas.tseries.period.PeriodIndex'>
[2013-12, ..., 2013-11]
Length: 7, Freq: M
In [22]: df.groupby(pd.DatetimeIndex(df.date).to_period('M')).nth(0)
Out[22]:
n date val
0 17 2013-12-05 0.1621
4 21 2013-11-29 0.1480
Run Code Online (Sandbox Code Playgroud)
这次排序df.date 是(正确)相关的,如果你知道它是按降序日期顺序你可以使用nth(-1):
In [23]: df.groupby(pd.DatetimeIndex(df.date).to_period('M')).nth(-1)
Out[23]:
n date val
3 20 2013-12-02 0.1555
6 23 2013-11-26 0.1648
Run Code Online (Sandbox Code Playgroud)
如果不能保证这一点,那么先按日期栏排序:df.sort('date').