在"月的第一个星期一"重新采样大熊猫时间序列。等等

时间:2014-09-30 14:59:34

标签: python pandas

我有一个(每日)pandas timeSeries,我需要过滤到每月,使用特定工作日的第n次出现作为选择日期的规则

到目前为止,我的想法是最好的方法是首先列出我感兴趣的所有日期的列表或系列,然后询问那些日期的时间序列?

但是,这仍然留下了如何列出例如所有"本月的第二个星期二" s发生在两个日期之间?

2 个答案:

答案 0 :(得分:2)

让我们看看2014年9月和10月:

from datetime import datetime
import pandas as pd

start = datetime(2014, 9, 1)
end = datetime(2014, 10, 30)
d = pd.date_range(start, end) # use bdate_range for business days

现在您可以构建一个仅包含您感兴趣的日期的面具:

>>> mask = (d.weekday == 1) & (7 < d.day) & (d.day < 15)
>>> d[mask]

<class 'pandas.tseries.index.DatetimeIndex'>
[2014-09-09, 2014-10-14]
Length: 2, Freq: None, Timezone: None

答案 1 :(得分:1)

一些虚拟数据:

In [44]: df = pd.DataFrame(data=range(1000), index=pd.date_range('1999-01-01', periods=1000), columns=['value'])

我们假设你想要每个月的第二个星期二。您可以使用内置的pandas offset

重新采样到一周中的特定日期
In [45]: df = df.resample('W-TUE', how='last')

然后,您可以计算一周中的某一列,并使用该列进行过滤。

In [50]: df['wom'] = df.groupby(pd.TimeGrouper('M'))['value'].transform(lambda x: range(len(x))) + 1

In [53]: df[df['wom'] == 2].head()
Out[53]: 
            value  wom
1999-01-12     11    2
1999-02-09     39    2
1999-03-09     67    2
1999-04-13    102    2
1999-05-11    130    2