在python时间对象中循环工作日

在python时间对象中循环工作日,python,datetime,strptime,Python,Datetime,Strptime,我有一个司机旅行日记的数据集。对于每次旅行,csv文件中都有相关的开始时间、结束时间和星期几。没有与旅行相关的日期 现在,我已经将数据输入python,其中每个开始时间和结束时间都有一个工作日,如下所示: time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=23, tm_min=45, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1) print jo

我有一个司机旅行日记的数据集。对于每次旅行,csv文件中都有相关的开始时间、结束时间和星期几。没有与旅行相关的日期

现在,我已经将数据输入python,其中每个开始时间和结束时间都有一个工作日,如下所示:

time.struct_time(tm_year=1900, tm_mon=1, tm_mday=1, tm_hour=23, 
                 tm_min=45, tm_sec=0, tm_wday=0, tm_yday=1, tm_isdst=-1)

print journey['BeginTime'][2].tm_wday, journey['BeginTime'][2].tm_hour
周一返回0,小时返回23

有11000次这样的旅行,我想得到的是一个基于一天中时间的每周行驶车辆数量的概况

这可以通过计算指定时间间隔内各自['BeginTime']和['EndTime']间隔之间的行程数来推断。五分钟的间隔就足够了,因为数据精确到五分钟

有没有一种优雅的python方法可以做到这一点?比如:

for fiveMinutes in Week:
count = 0
    for trip in range(len(journey['BeginTime']):
        if journey['BeginTime'][trip] == fiveMinutes
               or (journey['BeginTime'][trip] < fiveMinutes 
                   and journey['EndTime'][trip] > fiveMinutes):
           count = count + 1
carCount[fiveMinutes] = count
每周五分钟:
计数=0
对于范围内的旅行(len(旅行['BeginTime']):
如果旅程['BeginTime'][trip]==五分钟
或者(旅程['BeginTime'][trip]<5分钟
行程['EndTime'][trip]>5分钟):
计数=计数+1
车辆计数[五分钟]=计数

如果这有帮助,这里有一个想法

from datetime import datetime, timedelta

# This does not check for crossing from Sunday to Monday
def convert_dt(start_dt, journey):
    begin_weekday, begin_hour, begin_minute = journey[0]
    end_weekday, end_hour, end_minute = journey[1]

    begin_dt = start_dt + timedelta(days=begin_weekday)
    begin_dt += timedelta(hours=begin_hour, minutes=begin_minute)

    end_dt = start_dt + timedelta(days=end_weekday)
    end_dt += timedelta(hours=end_hour,minutes=end_minute)
    return (begin_dt, end_dt)

def get_slot_journeys(start_dt, journeys):           
    next_dt = start_dt
    slot_count =  60/5 * 24 * 7
    slot_dict = {}

    journey_dts = []
    #convert journey begin and end to datetimes
    for index in range(len(journeys['begin_weekday'])):
        next_journey = [(journeys['begin_weekday'][index],
                         journeys['begin_hour'][index],
                         journeys['begin_minute'][index],),
                        (journeys['end_weekday'][index],
                         journeys['end_hour'][index],
                         journeys['end_minute'][index],)
                       ]
        journey_dts.append(convert_dt(start_dt, next_journey))

    for slot in range(slot_count):
        slot_dict[next_dt] = 0
        for journey_start, journey_end in journey_dts:
            if next_dt >= journey_start and next_dt <= journey_end:
                slot_dict[next_dt] = slot_dict[next_dt] + 1                    

        next_dt += timedelta(minutes=(5))

    return slot_dict

if __name__ == "__main__":
    start_dt = datetime(2012, 1, 2, 0, 0)    

    journeys = {'begin_weekday': [0, 0],
                'begin_hour': [14, 18],
                'begin_minute': [20, 30],
                'end_weekday': [0, 1],
                'end_hour': [19, 12],
                'end_minute': [15, 55],
               }
    slot_dict = get_slot_journeys(start_dt, journeys)       
    slot_keys = slot_dict.keys()
    slot_keys.sort()

    for key in slot_keys:
        if slot_dict[key]:    
            print key, slot_dict[key]
从datetime导入datetime,timedelta
#这不检查从星期日到星期一的过境情况
def转换(开始、行程):
开始工作日、开始小时、开始分钟=旅程[0]
周末结束,小时结束,分钟结束=旅程[1]
开始时间=开始时间+时间增量(天=开始工作日)
开始时间=时间增量(小时=开始时间,分钟=开始分钟)
结束时间=开始时间+时间增量(天=结束工作日)
结束时间=时间增量(小时=结束时间,分钟=结束分钟)
返回(开始,结束)
def get_slot_行程(开始,行程):
下一步=开始
插槽计数=60/5*24*7
slot_dict={}
旅程_dts=[]
#将旅程开始和结束转换为日期时间
对于范围内的索引(len(行程['begin_weekday']):
下一次行程=[(行程['begin_weekday'][索引],
行程['begin_hour'][索引],
行程['begin_minute'][索引],),
(行程['end_weekday'][索引],
行程['end_hour'][索引],
行程['end_minute'][索引],)
]
旅程附加(转换旅程(开始、下一次旅程))
对于范围内的插槽(插槽计数):
时隙dict[next\u dt]=0
对于旅程开始,旅程结束在旅程dts中:

如果next\u dt>=travely\u start和next\u dt,看起来您使用的是一个包含大量列表的字典。使用一个字典列表,每个旅程一个字典不是更好吗?您需要担心跨越一天边界或一周边界的旅程吗?谢谢。如果您是第一个评论,您可能是对的!我有5 c来自调查的sv文件,每个文件都包含由唯一用户ID连接的旅行日记的不同方面。我只是想快速导入数据,所以我使用了此代码,但更好的方法是什么?def getCSVData(filename):data=csv.reader(open((filename),'rb'),delimiter=','quotechar=')headers=data.next()column={}对于页眉中的h:column[h]=[]对于数据中的行:对于zip中的h,v(页眉,行):column[h]。附加(v)返回列关于第二点,我已经在python代码中说明了不同日期的旅行,因此旅行可以在周一晚上11点开始(tm_day=0),在周二结束(tm_day=1)在凌晨1点。理想情况下,我希望使用python方法,使循环中的每个5分钟周期都特定于一天,这将解释这一点。这将有望解释周日/周一的边界。