我有一个pandas.core.series.Series
的特定日期(不连续),如下所示:
0 1998-06-09
1 1998-08-07
2 1998-09-11
3 1998-10-13
4 1998-11-03
...
231 2019-07-25
232 2019-09-12
233 2019-10-24
这些日期不一定是工作日。我需要创建一个列表或一系列日期来表示我拥有的列表的前一天。在新列表中,每个前一天必须是一个工作日,即(假设)1998-06-09是星期一,在新列表中,我应该得到1998-06-05,即前一个星期五。有什么建议吗?
答案 0 :(得分:4)
pd.offsets.BusinessDay
当您认为工作日为星期一-星期五
df['prev_bd'] = df['Date'] - pd.offsets.BusinessDay(n=1)
Date prev_bd
0 2012-12-20 2012-12-19
1 2012-12-21 2012-12-20
2 2012-12-22 2012-12-21
3 2012-12-23 2012-12-21
4 2012-12-24 2012-12-21
5 2012-12-25 2012-12-24
6 2012-12-26 2012-12-25
7 2012-12-27 2012-12-26
8 2012-12-28 2012-12-27
9 2012-12-29 2012-12-28
当您还想跳过假期(尤其是任何日期集)时。尽管您可以通过提供适当的日历来跳过想要的任何日期,但在这里我们不包括联邦假日。
from pandas.tseries.holiday import USFederalHolidayCalendar
df['prev_nohol'] = df['Date'] - pd.offsets.CustomBusinessDay(n=1, calendar=USFederalHolidayCalendar())
#PerformanceWarning
Date prev_bd prev_nohol
0 2012-12-20 2012-12-19 2012-12-19
1 2012-12-21 2012-12-20 2012-12-20
2 2012-12-22 2012-12-21 2012-12-21
3 2012-12-23 2012-12-21 2012-12-21
4 2012-12-24 2012-12-21 2012-12-21
5 2012-12-25 2012-12-24 2012-12-24
6 2012-12-26 2012-12-25 2012-12-24 # Christmas skipped because Federal Holiday
7 2012-12-27 2012-12-26 2012-12-26
8 2012-12-28 2012-12-27 2012-12-27
9 2012-12-29 2012-12-28 2012-12-28
import pandas as pd
df = pd.DataFrame({'Date': pd.date_range('2012-12-20', periods=10, freq='D')})