列出时间格式的元素并计算从今天开始的时间差

2024-04-24 22:04:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Python3.6,在计算日期时遇到了一些问题。你知道吗

我有一个由日期元素组成的列表,如下所示:

dates = [['2017','01','15'], ['2017','01','14'], ['2017','01','13'],...]

我想把它的时间格式和计算从今天起的日子。你知道吗

如何修复代码?你知道吗

下面是我的代码:

dates = [['2017', '01', '15'], ['2017', '01', '14'], ['2017', '01', '13']]

for date in dates:
    date_cand = "-".join(date)
    date_cand_time = time.strptime(date_cand,"%Y-%m-%d")
    (datetime.date.today() - datetime.date(date_cand_time)).days

我现在有这个错误消息:

TypeError: an integer is required (got type time.struct_time)

我想要的结果是:

4
5
6

请帮我解决这个问题。你知道吗


Tags: 代码in元素列表fordatetimedatetime
3条回答

这个python2/python3代码是Martijn和Tagc答案的组合。你知道吗

from datetime import datetime

def parse_dates(dates_array):
    today = datetime.today()
    for d in dates_array:
        yield (today - datetime(*map(int, d))).days

if __name__ == '__main__':
    dates = [
        ['2017', '01', '15'], 
        ['2017', '01', '14'], 
        ['2017', '01', '13'],
    ]
    for d in parse_dates(dates):
        print(d)

输出

4
5
6

正如Tagc所说,如果这个代码运行时日期可能会改变,那么您需要在for循环中移动today = datetime.today()。你知道吗


基本上是一样的,没有函数:

from datetime import datetime

dates = [
    ['2017', '01', '15'], 
    ['2017', '01', '14'], 
    ['2017', '01', '13'],
]

today = datetime.today()

for d in dates:
    delta = (today - datetime(*map(int, d))).days
    print(delta)

date_cand_time不是整数,它是一个带有整数的元组。你不能把它传递给datetime.date()对象。您必须将前3个元素作为单独的参数传入:

(datetime.date.today() - datetime.date(*date_cand_time[:3])).days

*告诉Python将lst_reg_date_cand_time[:3]表达式的值作为单独的参数应用。你知道吗

但是,我不会绕道time.strptime();只需将3个字符串映射为整数并直接传递它们:

date_cand = datetime.date(*map(int, date))
(datetime.date.today() - date_cand).days

datetime.date()的参数毕竟是yearmonthday,它们的顺序与字符串的顺序相同。你知道吗

如果必须使用strptime,则使用^{}并从中提取date对象:

date_cand = datetime.datetime.strptime("-".join(date), "%Y-%m-%d")
(datetime.date.today() - date_cand.date()).days

演示:

>>> import datetime
>>> dates = [['2017','01','15'], ['2017','01','14'], ['2017','01','13']]
>>> for date in dates:
...     # using map, produces a date
...     date_cand = datetime.date(*map(int, date))
...     print(date_cand, (datetime.date.today() - date_cand).days)
...     # using datetime.datetime.strptime, produces a datetime
...     date_cand = datetime.datetime.strptime("-".join(date), "%Y-%m-%d")
...     print(date_cand, (datetime.date.today() - date_cand.date()).days)
...
2017-01-15 4
2017-01-15 00:00:00 4
2017-01-14 5
2017-01-14 00:00:00 5
2017-01-13 6
2017-01-13 00:00:00 6

这个代码似乎有效。请注意,我使用datetime.strptime而不是time.strptime,以防出现任何差异:

from datetime import datetime


def parse_dates(dates_array):
    today = datetime.today()
    for date_array in dates_array:
        date = datetime.strptime('-'.join(date_array), '%Y-%m-%d')
        yield (today - date).days


if __name__ == '__main__':
    dates = [['2017', '01', '15'], ['2017', '01', '14'], ['2017', '01', '13']]
    for days_from_today in parse_dates(dates):
        print(days_from_today)

输出

4
5
6

警告

我将today的计算移到for循环之外,以获得较小的性能优势,但是如果您让此代码运行到午夜之后,这将导致代码中断。:)

相关问题 更多 >