У меня есть рабочий код для расчета рабочих часов между двумя датами, используя df.apply()
.Однако, учитывая, что моя df ~ 40k строк, это очень медленно, есть ли способ, которым я мог бы ускорить это с помощью векторизации?
Оригинальный код:
import datetime
import pytz
import businesstimedelta
import holidays as pyholidays
workday = businesstimedelta.WorkDayRule(
start_time=datetime.time(9),
end_time=datetime.time(17),
working_days=[0, 1, 2, 3, 4])
vic_holidays = pyholidays.AU(prov='VIC')
holidays = businesstimedelta.HolidayRule(vic_holidays)
businesshrs = businesstimedelta.Rules([workday, holidays])
def BusHrs(start, end):
return businesshrs.difference(start,end).hours+float(businesshrs.difference(start,end).seconds)/float(3600)
df['Diff Hrs'] = df.apply(lambda row: BusHrs(row['Updated Date'], row['Current Date']), axis=1)
Дает:
Index Created Date Updated Date Diff Hrs Current Date
10086 2016-11-04 16:00:00 2016-11-11 11:38:00 35.633333 2018-05-29 10:09:11.291391
10087 2016-11-04 16:03:00 2016-11-29 12:54:00 132.850000 2018-05-29 10:09:11.291391
10088 2016-11-04 16:05:00 2016-11-16 08:05:00 56.916667 2018-05-29 10:09:11.291391
10089 2016-11-04 16:17:00 2016-11-08 11:37:00 11.333333 2018-05-29 10:09:11.291391
10090 2016-11-04 16:20:00 2016-11-16 09:58:00 57.633333 2018-05-29 10:09:11.291391
10091 2016-11-04 16:32:00 2016-11-08 11:10:00 10.633333 2018-05-29 10:09:11.291391
Я вижу, как он хрустит и похоже, что на его завершение может уйти более 5 часов.
Любопытно, что у меня есть догадка, что он вычисляется быстрее, чем ближе две даты вместе.Ex.df['Time Since Last Update'] = df.apply(lambda row: BusHrs(row['Updated Date'], row['Current Date']), axis=1)
намного быстрее, чем
df['Time Since Last Update'] = df.apply(lambda row: BusHrs(row['Created Date'], row['Updated Date']), axis=1)
Оптимизация, подобная этой, на шаг выше того, к чему я привык, поэтому любая помощь приветствуется.