2017-06-17 103 views
0

我想減去包含在分隔列表中的日期值並只存儲小於24小時的結果並將它們轉換爲小時。這是我到目前爲止的代碼:如何將一個DateTime對象轉換爲python中的小時?

#stored lists of dates 

closure_date = ['2017-06-13 11:00:00', '2017-06-09 11:00:00', '2017-06-02 11:00:00'] 
opening_date = ['2017-06-13 05:00:00', '2017-06-09 05:00:00', '2017-06-02 05:00:00'] 

results = [] 

#Subtract the dates 
results.append([datetime.strptime(c,'%Y-%m-%d %H:%M:%S') - datetime.strptime(o,'%Y-%m-%d %H:%M:%S') for c, o in zip(closure, opening) if datetime.strptime(c,'%Y-%m-%d %H:%M:%S') - datetime.strptime(o,'%Y-%m-%d %H:%M:%S')<timedelta(hours=24)]) 

結果我得到的是一個雙榜與以秒爲單位的格式不超過24小時的結果。

[[datetime.timedelta(0, 21600), datetime.timedelta(0, 21600)]] 

一種方法我試過了,從結果列表中得到那些秒後,3600將每個結果得到的時間格式,是這樣的:

for r in results: 
    hour.append(r.datetime.timedelta(days=1).total_seconds()/3600) 

但是,這是不可能的,因爲我得到錯誤AttributeError:'list'對象沒有屬性'datetime'這是合理的,因爲結果是在雙重列表中,我需要另一個索引從最內部的列表中提取每個結果,IMO不容易操作和我相信有更好的方法來實現這個目標。

我怎樣才能以更好更簡單的方式從雙列表中獲得秒數,以便日後操作進行其他算術計算?

+0

看看https://pymotw.com/2/datetime/ – MishaVacic

回答

2

做你有幾件事情會在這裏。

首先,您正在獲取列表的列表,因爲您使用的是append(),它將一個項目添加到列表中。在這種情況下,該項目本身就是一個列表:列表理解的結果。如果你不想要這個,只是想添加一個迭代項到列表中,你應該extend()。但是,由於您使用的是列表解析創建列表([for ... in ...if...]),你應該改變你的代碼,以擺脫

results = [] 

而且根本就

#Subtract the dates 
results = [datetime.strptime(c,'%Y-%m-%d %H:%M:%S') - datetime.strptime(o,'%Y-%m-%d %H:%M:%S') for c, o in zip(closure, opening) if datetime.strptime(c,'%Y-%m-%d %H:%M:%S') - datetime.strptime(o,'%Y-%m-%d %H:%M:%S')<timedelta(hours=24)] 

,因爲結果是一個列表本身。

然後你可以迭代results並做你想要的計算。

但是,恕我直言,我認爲你在這裏使用列表理解複雜化的事情。如果你只是寫了for循環,你的代碼會更合理。

results = [] 
for c, o in zip(closing, opening): 
    delta_t = datetime.strptime(c,'%Y-%m-%d %H:%M:%S') - datetime.strptime(o,'%Y-%m-%d %H:%M:%S') for c, o in zip(closure, opening) 
    if delta_t < timedelta(hours=24): 
     results.append(delta_t.total_seconds()/3600) 
+0

工程就像一個魅力!這絕對解決了我的問題,代碼簡潔易讀。 –

+0

好。很高興它的工作! – TWReever

1

隨着dateutil庫,這可以很容易地

import datetime 
from dateutil.parser import parse 

closure_date = [ 
    '2017-06-13 11:00:00', '2017-06-09 11:00:00', '2017-06-02 11:00:00'] 
opening_date = [ 
    '2017-06-13 05:00:00', '2017-06-09 05:00:00', '2017-06-02 05:00:00'] 


results = [ 
    int((parse(c) - parse(o)).total_seconds()/3600) 
    for c, o in zip(closure_date, opening_date) 
    if parse(c) - parse(o) < datetime.timedelta(hours=24)] 


>>> results = [6, 6, 6] 
0

這不是和你的一樣簡潔,但我覺得它更容易閱讀。

from datetime import datetime, timedelta 

datetime_format = '%Y-%m-%d %H:%M:%S' 
closure_date = ['2017-06-13 11:00:00', '2017-06-09 11:00:00', '2017-06-02 11:00:00'] 
opening_date = ['2017-06-13 05:00:00', '2017-06-09 05:00:00', '2017-06-02 05:00:00'] 

results = [] 
for closing, opening in zip(closure_date, opening_date): 
    delta = datetime.strptime(closing, datetime_format) - datetime.strptime(opening, datetime_format) 
    if(delta < timedelta(hours=24)): 
     results.append(delta.seconds/3600) 

for result in results: 
    print(result) 
相關問題