python - Pandas - 获取日期和当前时间之间的营业时间
问题描述
我知道这是一个经常被问到的问题,但我只找到了一个解决方案,允许我通过使用businesstimedelta
库来使用本地日历和假期。
我当前用于在两个日期列之间获取数据的代码有效。
df 如下(创建日期列使用pd.datetime.now()
:
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
Created Date
产生和之间差异的工作代码Updated Date
如下:
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['Created Date'], row['Updated Date']), axis=1)
运行需要一段时间但可以工作 - 但是尝试根据当前时间和更新时间之间的差异创建一个新列。df['Time Since Last Update'] = df.apply(lambda row: BusHrs(row['Current Date'], row['Updated Date']), axis=1)
失败/永远,我不知道为什么。
Time Since Last Update
非常感谢任何有关计算的帮助。
解决方案
你需要在你的,row['Current Date']
然后用row['Updated Date']
df['Time Since Last Update']
df['Time Since Last Update'] = df.apply(lambda row: BusHrs(row['Updated Date'], row['Current Date']), axis=1)
它应该工作。我认为start
不能end
在函数之后businesshrs.difference
。此外,如果您想加快代码速度,请执行以下操作:
def BusHrs(start, end):
diff_businesshrs = businesshrs.difference(start,end)
# like this you calculate only once businesshrs.difference(start,end)
return diff_businesshrs.hours+float(diff_businesshrs.seconds)/float(3600)
编辑我想我找到了一种更快的方法。因为从 2016 年到现在的事情之间的营业时间计算每一行的时间很长,我认为你可以通过计算两个连续更新日期之间的小时数,然后sum
在这些部分计算直到当前日期之前做得更快。您需要两个临时列,一个具有移动的更新日期,另一个具有部分营业时间
df = df.sort_values('Updated Date').reset_index()
df['Shift Date'] = df['Updated Date'].shift(-1).fillna(pd.datetime.now())
df['BsnHrs Partial'] = df.apply(lambda row: BusHrs(row['Updated Date'], row['Shift Date']), axis=1)
df['Time Since Last Update'] = df.apply(lambda row: df['BsnHrs Partial'][row.name:].sum(), axis=1)
df = df.drop(['Shift Date','BsnHrs Partial'],1).set_index('index') # drop and reindex
df = df.sort_index() #if you want to go back to the original order
推荐阅读
- ajax - 413 请求实体过大码头服务器
- c# - 如何使用 rowdeleting 事件删除行?
- python - 如何将字典中的列表元素相乘
- java - Java程序计算文件中的重复行
- c# - 如何将下拉列表中的 SelectedItem 添加到使用模型列表<>
我正在处理一个页面,该页面将使用按钮 onclick 将下拉列表中的选定项目添加到 List<>。
问题是新的选定项正在覆盖旧值。
我只是想显示来自所选项目的表格,如下所示:
#---Model-----Remove----- 1 Model#1 x 2 Model#2 x 3 M
- google-cloud-platform - 我调整了 GCP 实例的大小,但运行“df”时没有显示新大小
- vb.net - 不允许用户从 VB.NET 中的目录移动
- r - 选择或子集列总和不为零的变量
- c# - C# 使用 array.length 遍历数组并从 MSSQL 服务器添加价格。基于数组索引
- excel - 将中间名修剪为中间名