我试图减去分隔列表中包含的日期值,并仅存储少于24小时的结果并将其转换为小时。这是我到目前为止的代码:
#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:&#39; list&#39;对象没有属性&#39; datetime&#39; 这是合理的,因为结果是双列表,我需要另一个索引从最内部列表中提取每个结果,IMO不易操作,我我相信有更好的方法来实现这一目标。
如何以更好,更简单的方式从双列表中获取秒数小时,以便稍后进行其他算术运算?
答案 0 :(得分: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)
答案 1 :(得分: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]
答案 2 :(得分:1)
这不像你的那么简洁,但我觉得它更容易阅读。
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)