熊猫:to_timedelta与工作日

问题描述 投票:1回答:2

我想循环一个只有工作日的日期范围,即没有周末。要做到这一点,我有以下命令基本上每个月的第三个星期五选择并使列窗口等于从第三个星期五起的2天,20天。这段代码完全正常。

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]  

但是,在20

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

命令是指20天,包括周末,但我希望它指的是20个周末;例如这样的事情:

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]  
python pandas datetime timedelta
2个回答
3
投票

我相信你正在寻找BDay约会

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

new_date = beg + BDay(20)

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


0
投票

20个工作日正好是28个日历日。

从而

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

应该管用

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