如何在Python中将DateTime对象转换为小时?

时间:2017-06-17 02:40:18

标签: python python-3.x datetime

我试图减去分隔列表中包含的日期值,并仅存储少于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不易操作,我我相信有更好的方法来实现这一目标。

如何以更好,更简单的方式从双列表中获取秒数小时,以便稍后进行其他算术运算?

3 个答案:

答案 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)