首页 > 解决方案 > 计算时间间隔

问题描述

我正在尝试计算车辆在特定时间(上午 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 之后捕捉剩余时间的想法或建议将不胜感激。

标签: pythonpandas

解决方案


在您的代码中,对于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']))

推荐阅读