python - 计算时间间隔
问题描述
我正在尝试计算车辆在特定时间(上午 6:00 至下午 18:00 和下午 18:00 至上午 6:00)之间停放的时间量。我可以成功计算出车辆从早上 6:00 到晚上 18:00 和晚上 18:00 到晚上 11:59 停放的时间。一旦时间越过晚上 11:59(到凌晨 12:00),它就无法再计算。
车辆 CSV:
vehicle park_start_time park_end_time duration enforce_time_1 enforce_time_2
car1 2/10/2018 14:13 2/10/2018 14:20 7 6:00 to 18:00 18:00 to 6:00
car2 2/2/2018 11:06 2/3/2018 19:17 1931 6:00 to 18:00 18:00 to 6:00
代码:
import numpy as np
import pandas as pd
df = pd.read_csv('vehicle.csv', sep=';')
test = df
test['Start_Enforce_1'] = test['enforced_time_1'].str.split().str[0].str.split(':').str[0].astype(int)
test['Finish_Enforce_1'] = test['enforced_time_1'].str.split().str[-1].str.split(':').str[0].astype(int)
test['Start_Enforce_2'] = test['enforced_time_2'].str.split().str[0].str.split(':').str[0].astype(int)
test['Finish_Enforce_2'] = test['enforced_time_2'].str.split().str[-1].str.split(':').str[0].astype(int)
def check_time(df_line):
max_hours = float(df_line['max time'])
dt_range = pd.date_range(start = df_line['Parked_from'], end=df_line['Parked_to'], freq='1Min')
return np.sum((dt_range.hour >= (df_line['Start_Enforce_1'])) & (dt_range.hour < df_line['Finish_Enforce_1']))
def check_time_2(df_line):
max_hours = float(df_line['max time'])
dt_range = pd.date_range(start = df_line['Parked_from'], end=df_line['Parked_to'], freq='1Min')
return np.sum((dt_range.hour >= (df_line['Start_Enforce_2'])) & (dt_range.hour < df_line['Finish_Enforce_2']))
test['6am to 18pm'] = test.apply(check_time, axis=1)
test['18pm to 6am'] = test.apply(check_time_2, axis=1)
test.to_csv("result.csv", sep=';', encoding='utf-8', index=False)
结果:
vehicle;park_start_time;park_end_time;duration;enforced_time_1;enforced_time_2;Start_Enforce_1;Finish_Enforce_1;Start_Enforce_2;Finish_Enforce_2;6am to 18pm;18pm to 6am
car1;2/10/2018 14:13;2/10/2018 14:20;7;6:00 to 18:00;18:00 to 6:00;6;18;18;6;8;0
car2;2/2/2018 11:06;2/3/2018 19:17;1931;6:00 to 18:00;18:00 to 6:00;6;18;18;6;1134;0
如您所见,对于car2,仅捕获了上午 6 点到晚上 18 点期间的停车时间,停车时间为1134 分钟。任何关于如何在晚上 11:59 之后捕捉剩余时间的想法或建议将不胜感激。
解决方案
在您的代码中,对于check_time_2
,如果您将&
(and)替换为|
(or),它应该会更好,因为小时数低于 6 或高于 18,并且不能两者都像 in check_time
,它必须同时高于 6 和低于18. 所以你的功能check_time_2
应该是:
def check_time_2(df_line):
max_hours = float(df_line['max time']) # not sure it's necessary actually...
dt_range = pd.date_range(start = df_line['Parked_from'], end=df_line['Parked_to'], freq='1Min')
return np.sum((dt_range.hour >= (df_line['Start_Enforce_2'])) | (dt_range.hour < df_line['Finish_Enforce_2']))
推荐阅读
- python - 没有过滤器的列表推导
- javascript - Javascript location.href 在 PHP echo 中未被识别
- c# - c#中VB的CreateObject等价代码
- c# - 如何用 ListView 实现 ObservableCollection?
- python - 二进制字符串到二进制数
- locking - 如何使函数原子化?
- android - 调用方法 notifyDataSetChanged() 后 GridView 不会立即更新
- r - 从 RStudio 中的大型语料库中删除停用词
- c - 漏洞利用开发——GETS 和 Shellcode
- c# - 显示从服务器下载的多个图像