我试图按照每月最后一天的条件对数据框进行子集操作。我使用了以下代码:
df['Month_End'] = df.index.is_month_end
sample = df[df['Month_End'] == 1]
这个方法可行,但我正在处理股市数据,所以我错过了所有实际月末在周末的情况,我需要一种选择“月末最后一个工作日”的方法。
我试图按照每月最后一天的条件对数据框进行子集操作。我使用了以下代码:
df['Month_End'] = df.index.is_month_end
sample = df[df['Month_End'] == 1]
这个方法可行,但我正在处理股市数据,所以我错过了所有实际月末在周末的情况,我需要一种选择“月末最后一个工作日”的方法。
通过传入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
不必生成系列,您还可以从日期时间索引中解析业务月末,如下所示:
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
df = df[(df.index + pd.offsets.BMonthEnd(0)).day == df.index.day]
这是用于从给定索引为日期时间类型的DataFrame对象中筛选出每个月的最后一个工作日的代码。
df.resample('BM').mean()