如何在 Pandas 中选择“本月最后一个工作日”?

问题描述 投票:0回答:3

我试图在本月最后一天的条件下对 DataFrame 进行子集化。我用过:

df['Month_End'] = df.index.is_month_end
sample = df[df['Month_End'] == 1]

这可行,但我正在处理股票市场数据,所以我错过了所有实际月底在周末的情况,我需要一种方法来选择“该月的最后一个工作日”。

python pandas datetime dataframe time-series
3个回答
13
投票

您可以通过传入 freq='BM' 来生成包含每月最后一个工作日的

时间序列

例如,要创建 2014 年最后一个工作日的系列:

>>> pd.date_range('1/1/2014', periods=12, freq='BM')
[2014-01-31 00:00:00, ..., 2014-12-31 00:00:00]
Length: 12, Freq: BM, Timezone: None

然后,您可以使用此时间序列对您的 DataFrame 进行子集化/重新索引。


3
投票

除了生成系列之外,您还可以从日期时间索引中解析业务月末,如下所示:

df['BMonthEnd'] = (df.index + pd.offsets.BMonthEnd(1)).day

请注意,这目前会引发无害的警告 - 请参阅 http://pandas.pydata.org/pandas-docs/stable/timeseries.html#using-offsets-with-series-datetimeindex

注意:如果日 (

d
) 已经是该月的最后一个工作日,那么
d + pd.offsets.BMonthEnd(1)
将给出下个月的最后一个工作日。如果不希望出现这种情况,请使用
pd.offsets.BMonthEnd(0)
代替:

df['BMonthEnd'] = (df.index + pd.offsets.BMonthEnd(0)).day

编辑: 按照OP的要求实际过滤df:

df = df[(df.index + pd.offsets.BMonthEnd(0)).day == df.index.day]

0
投票

这是从 DataFrame 对象中过滤每个月的最后一个工作日,前提是索引是日期时间类型。

df.resample('BM').mean()

© www.soinside.com 2019 - 2024. All rights reserved.