我有一个(每日)pandas timeSeries,我需要过滤到每月,使用特定工作日的第n次出现作为选择日期的规则
到目前为止,我的想法是最好的方法是首先列出我感兴趣的所有日期的列表或系列,然后询问那些日期的时间序列?
但是,这仍然留下了如何列出例如所有"本月的第二个星期二" s发生在两个日期之间?
答案 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