2017-05-31 67 views
1

我想遍歷只有工作日的日期範圍,即沒有周末。 要做到這一點,我有以下命令,基本上每月選擇第三個星期五,並使列窗口從第三個星期五開始等於2,20天。這段代碼工作得很好。pandas:to_timedelta和工作日

for beg in pd.bdate_range("2000-01-01", "2017-05-01"):  
    beg= third_friday 
    df["window"].loc[beg: beg + pd.to_timedelta(20,"D")] = 2 
    if month==12: 
     year=year+1 
     month=0 
    if year>=2017 and month>=3: 
     break 
    month = month +3 
    monthcal = c.monthdatescalendar(year,month) 
    third_friday = [day for week in monthcal for day in week if \ 
       day.weekday() == calendar.FRIDAY and \ 
       day.month == month][2] 

然而,在

df["window"].loc[beg: beg + pd.to_timedelta(20,"D")] = 2 

命令20指的是20天,包括週末,但我想它來指20個WEEKDAYS;例如是這樣的:

df["window"].loc[beg: beg + pd.to_timedelta(20, "Weekdays_only")] = 2 

是否有一個簡單的辦法,這樣我可以用別的東西代替「d」還是我不得不重寫一切嗎?此外,我還想用不同的值來標記第三個星期五週圍的日子,例如, third_friday之後的第1天是1,第2天是2.要做到這一點,我寫了第二個for循環。在這裏,完整的例子:

for beg in pd.bdate_range("2000-01-01", "2017-05-01"):  
beg= third_friday 
lower_counter = 0 
for j in range(0,-21,-1):  
    df["window_counter"].loc[beg - pd.to_timedelta(j,"D"):beg] = lower_counter  
    lower_counter = j   

df["window"].loc[beg: beg + pd.to_timedelta(20,"D")] = 2 
if month==12: 
    year=year+1 
    month=0 
if year>=2017 and month>=3: 
    break 
month = month +3 
monthcal = c.monthdatescalendar(year,month) 
third_friday = [day for week in monthcal for day in week if \ 
      day.weekday() == calendar.FRIDAY and \ 
      day.month == month][2] 
+0

看一看這個[SO後(https://stackoverflow.com/questions/31588148/adding-business-days-to-datetime-column ) –

回答

3

我相信你正在尋找BDay日期關閉設置

import pandas as pd 
from pandas.tseries.offsets import * 

new_date = beg + DBay(20) 

http://pandas.pydata.org/pandas-docs/stable/timeseries.html#dateoffset-objects

+0

如果我喜歡'df [「window」]。loc [beg:beg + pd.to_timedelta(20,bday(1))] = 2'我得到NameError:name'bday'沒有被定義。 –

+0

您不會將它傳遞給'to_timedelta' BDay'構造函數已經給您返回一個您剛剛添加到開始時間的自定義時間偏移對象 - 請參閱上面的編輯 –

+0

好的,謝謝。但是,我在一個函數中運行整個東西,當我從'pandas.tseries.offsets import *'中執行''我得到SyntaxError:import *只允許在模塊級別。 –

0

20工作日正好是28天了。

因此

df["window"].loc[beg: beg + pd.to_timedelta(28,"D")] = 2 

應工作

+0

謝謝,我編輯了上面的例子。我也想標記他們距離每個月的第三個星期五還有多遠。我編輯了我的上面的例子。然後,28天解決方案不再工作了。 –