pandas:to_timedelta 工作日
pandas: to_timedelta with business days
我想遍历一个只有工作日的日期范围,即没有周末。
为此,我有以下命令,基本上选择一个月中的每个第三个星期五,并使列 window 等于从第三个星期五开始的 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]
我相信您正在寻找 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
20 个工作日恰好是 28 个日历日。
因此
df["window"].loc[beg: beg + pd.to_timedelta(28,"D")] = 2
应该可以
我想遍历一个只有工作日的日期范围,即没有周末。 为此,我有以下命令,基本上选择一个月中的每个第三个星期五,并使列 window 等于从第三个星期五开始的 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]
然而,
中的 20df["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]
我相信您正在寻找 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
20 个工作日恰好是 28 个日历日。
因此
df["window"].loc[beg: beg + pd.to_timedelta(28,"D")] = 2
应该可以