2017-06-17 105 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) 
相关问题