我正在尝试减去分隔列表中包含的日期值并仅存储小于 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: 'list' object has no attribute 'datetime' 这是合理的,因为结果在双列表中,我需要另一个索引来从最内层的列表中提取每个结果,IMO 操作起来并不简单,我相信有更好的方法来实现这个目标。
如何以更好和更简单的方式从双重列表中获取秒数到小时数,以便稍后进行其他算术计算?
最佳答案
这里发生了一些事情。
首先,您将获得一个列表的列表,因为您正在使用 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)
关于python - 如何在 python 中将 DateTime 对象转换为小时数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44600265/