我正在使用熊猫,我想知道使用熊猫在开始日期和结束日期之间的最简单方法是什么?
关于在Python中执行此操作有很多帖子(例如),但我有兴趣直接使用pandas,因为我认为pandas可能很容易处理这个问题.
这与这里的问题非常相似,但我想知道大熊猫是否有一种干净的方式让工作日意识到TimedeltaIndex?最终,我试图获取DatetimeIndex和Timestamp之间的工作日数(没有假日日历).根据引用的问题,这样的事情是有效的
import pandas as pd
import numpy as np
drg = pd.date_range('2015-07-31', '2015-08-05', freq='B')
A = [d.date() for d in drg]
B = pd.Timestamp('2015-08-05', 'B').date()
np.busday_count(A, B)
Run Code Online (Sandbox Code Playgroud)
这使
array([3, 2, 1, 0], dtype=int64)
Run Code Online (Sandbox Code Playgroud)
但这似乎有点笨拙.如果我尝试类似的东西
drg - pd.Timestamp('2015-08-05', 'B')
Run Code Online (Sandbox Code Playgroud)
我得到了一个TimedeltaIndex,但工作日频率被取消了
TimedeltaIndex(['-5 days', '-2 days', '-1 days', '0 days'], dtype='timedelta64[ns]', freq=None)
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有更优雅的方式来解决这个问题.
有没有更好/更直接的方法来计算这个比以下?
# 1. Set up the start and end date for which you want to calculate the
# number of business days excluding holidays.
start_date = '01JAN1986'
end_date = '31DEC1987'
start_date = datetime.datetime.strptime(start_date, '%d%b%Y')
end_date = datetime.datetime.strptime(end_date, '%d%b%Y')
# 2. Generate a list of holidays over this period
from pandas.tseries.holiday import USFederalHolidayCalendar
calendar = USFederalHolidayCalendar()
holidays = calendar.holidays(start_date, end_date)
holidays
Run Code Online (Sandbox Code Playgroud)
这给出了一个pandas.tseries.index.DatetimeIndex
DatetimeIndex(['1986-01-01', '1986-01-20', '1986-02-17', '1986-05-26',
'1986-07-04', '1986-09-01', '1986-10-13', '1986-11-11',
'1986-11-27', '1986-12-25', '1987-01-01', '1987-01-19',
'1987-02-16', '1987-05-25', '1987-07-03', '1987-09-07',
'1987-10-12', '1987-11-11', '1987-11-26', …Run Code Online (Sandbox Code Playgroud) 我想循环遍历一个只有工作日的日期范围,即没有周末。为此,我使用以下命令,基本上选取一个月中的每个第三个星期五,并使列窗口等于从第三个星期五开始的 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]
Run Code Online (Sandbox Code Playgroud)
然而,20 中
df["window"].loc[beg: beg + pd.to_timedelta(20,"D")] = 2
Run Code Online (Sandbox Code Playgroud)
命令指的是 20 天,包括周末,但我希望它指的是 20 个工作日;例如这样的东西:
df["window"].loc[beg: beg + pd.to_timedelta(20, "Weekdays_only")] = 2
Run Code Online (Sandbox Code Playgroud)
是否有一个简单的修复方法,以便我可以用其他内容替换“D”,或者我是否必须重写所有内容?
此外,我还想用不同的值标记第三个星期五周围的日子,例如third_friday之后的day +1是1,day+2是2。为此,我编写了第二个for循环。这里是完整的例子:
for beg in pd.bdate_range("2000-01-01", …Run Code Online (Sandbox Code Playgroud)