【问题标题】:How can I select 'last business day of the month' in Pandas?如何在 Pandas 中选择“本月的最后一个工作日”?
【发布时间】:2015-01-28 21:02:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: python pandas datetime dataframe time-series


    【解决方案1】:

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

    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
    

    【讨论】:

    • 请注意,这种方法并不完美。如果“d”日是该月的最后一个工作日,则 d+BMonthEnd(1) 为您提供下个月的最后一个工作日。
    【解决方案2】:

    您可以通过传入freq='BM' 生成带有每个月最后一个工作日的time series

    例如,要创建一系列 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。

    【讨论】:

    • 此解决方案有效。唯一的问题是,在某些系列中,当月的最后一个工作日可能是“自定义假期”,因此您需要将其纳入等式。
    • 我在这个问题中使用了公认的答案:stackoverflow.com/questions/45644857/…,但有没有更好的方法来subset/reindex
    • hernanavella 的评论很关键。我们如何在 Python 中解决这个简单的问题?我们只想要一个简洁明了的简单问题:一个月的最后一个股票交易日。
    猜你喜欢
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2018-03-13
    • 2023-02-15
    • 2016-09-23
    • 2017-05-03
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多