Python中计算两个日期之间的小时范围

3

如何找出日期范围内的小时数?我目前正在计算并打印两个给定日期之间的日期。

from datetime import timedelta as td, datetime

d1 = datetime.strptime(start_date, '%Y-%m-%d')
d2 = datetime.strptime(end_date, '%Y-%m-%d')

def get_delta(d1, d2):
    delta = d2 - d1
    return delta

delta = get_delta(d1,d2)
for i in range(delta.days + 1):
    print d1 + td(days=i)

当前输出:

2016-04-22
2016-04-23
2016-04-24
2016-04-25
2016-04-26
2016-04-27
2016-04-28
...

预期输出:

2016-04-22 00:00:00
2016-04-22 01:00:00
2016-04-22 02:00:00
2016-04-22 03:00:00
2016-04-22 04:00:00
2016-04-22 05:00:00
2016-04-22 06:00:00
2016-04-22 07:00:00
...

1
get_delta()是什么?d1和d2是datetime.datetime对象还是datetime.date对象? - kingledion
5个回答

7
您需要将时间按天而非按小时递增,使用 timedelta(days=i) 而不是 timedelta(hours=i)
from datetime import timedelta as td, datetime

start_date = '2016-01-01'
end_date = '2016-01-02'
d1 = datetime.strptime(start_date, '%Y-%m-%d')
d2 = datetime.strptime(end_date, '%Y-%m-%d')

def get_delta(d1, d2):
    delta = d2 - d1
    return delta

delta = get_delta(d1,d2)
for i in range(delta.days * 24 + 1):
    print d1 + td(hours=i)

输出:

2016-01-01 00:00:00
2016-01-01 01:00:00
...
...
2016-01-01 23:00:00
2016-01-02 00:00:00

1
这难道不会一直运行到最后一天的整个时间,而不仅仅是 end_date 所在小时的时间吗? - Michael
是的,它会。我只是尽可能地保持原始代码片段的接近程度。 - Maximilian Peters
1
好的。只要原帖作者坚持使用格式“%Y-%m-%d”获取日期,就不会有问题。虽然我想指出这一点。 - Michael
@MaximilianPeters 这将仅涵盖整个日期,如果我们想要到达end_date的小时怎么办?谢谢。 - Eric
@Eric,我不确定我是否正确理解了你的问题,但是你可以将小时添加到你的end_date并相应地调整datetime对象格式。这是同一个问题吗?https://stackoverflow.com/questions/52841611/getting-number-of-hours-between-a-date-time-range-in-python - Maximilian Peters

2

为了提高可读性,在边缘情况下清晰地定义发生的语义,您可以定义一个类似于内置range()函数的date_range()函数:

def date_range(start, end, step):
    while start < end:
        yield start
        start += step

例子:

from datetime import datetime, timedelta

HOUR = timedelta(hours=1)

def parse(date_string):
    '''Parse *date_string* in the %Y-%m-%d format.'''
    return datetime(*map(int, date_string.split('-')))

for dt in date_range(parse(start_date), parse(end_date), HOUR):
    print(dt)

注意:end_date + ' 00:00:00不会出现在输出中。 date_range()的行为类似于range(),其中不包括end。您可以传递parse(end_date) + HOUR来包含end_date

1

如果您查看 timedelta 对象的 Python 文档:

只有天、秒和微秒被内部存储。

因此,如果您想获取小时数,您需要从秒转换。

类似于以下内容:

for i in range(delta.seconds / 3600 + delta.days * 24):
    print d1 + td(seconds=3600 * i)

1
试试这样做:
import datetime

d1 = datetime.datetime(2016, 4, 28)
d2 = d1 + datetime.timedelta(days = 2)

delta = (d2 - d1).total_seconds()/3600
for i in range(int(delta)):
    print(d1 + datetime.timedelta(hours=i))

0
使用Pandas
import pandas as pd
datelist = pd.date_range(start = pd.datetime(2016, 1, 1, 0),
                         end = pd.datetime(2016, 1, 2, 0),
                         freq = "H")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接