2012-05-25 22 views
0

我有一個驅動程序的旅行日記的數據集。對於每次出行,在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。

這些旅程中有11,000個,我想要得到的是根據一天中的時間駕駛的汽車數量的每週概況。

這可以通過計算指定時間間隔內各自['BeginTime']和['EndTime']間隔之間的行程數來推斷。 5分鐘的時間間隔就足夠了,因爲數據是最近的五分鐘。

有沒有一個優雅的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

它看起來像您使用的是字典,一堆在它列表。使用字典列表不是更好,每行程一個字典? – jcfollower

+0

您是否需要擔心跨越一天邊界或一週邊界的旅程? – jcfollower

+0

謝謝jcfollower。重新發表您的第一條評論,您可能是對的!我有5個來自調查的csv文件,每個文件都涵蓋了由唯一用戶ID連接的旅行日記的不同方面。我只是想要一個快速的方式來導入數據,所以我使用這個代碼,但有什麼更好的方法? DEF getCSVData(文件名): \t數據= csv.reader(開放((文件名), 'RB'),分隔符=」, 'quotechar ='「') \t \t 頭= data.next() \t列= {} \t在頭H: \t柱並[h] = [] \t \t在數據行: \t \t爲H,v在拉鍊(標頭,行):\t \t \t \t \t柱[h] .append(v) \t返回專欄 – user578582

回答

0

在這種情況下幫助,這裏是一個想法...

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]