Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python计算日期之间的小时范围_Python_Datetime - Fatal编程技术网

用python计算日期之间的小时范围

用python计算日期之间的小时范围,python,datetime,Python,Datetime,我如何找出日期范围内的小时数?我目前正在计算和打印两个给定日期之间的日期 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

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

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
...

如果查看timedelta对象的python文档:

内部仅存储天、秒和微秒

因此,如果你想得到小时数,你必须把它从秒数转换成小时数

比如:

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

您正在按天而不是按小时递增时间,
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

试着这样做:

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

为了便于阅读,为了明确边缘情况下的语义,可以定义类似于内置
range()
函数的
date\u range()
函数:

def date_range(start, end, step):
    while start < end:
        yield start
        start += step
注意:
end_date+'00:00:00
不在输出中<代码>日期范围()。您可以使用pandas通过
parse(end_date)+HOUR
来包含
end_date

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

什么是get_delta()?d1和d2是datetime.datetime对象还是datetime.date对象?这不会一直持续到最后一天,而不仅仅是结束日期的一小时吗?是的,会的。我只是尽量靠近原始代码片段。这很公平。我想只要OP坚持从格式“%Y-%m-%d”获取日期,就不会有问题。我想我会指出这一点的。@Maximilian预计这只会持续一整天,如果我们想去约会的最后时刻呢?thanks@Eric我不确定我是否正确理解了您的问题,但您可以将小时添加到您的
结束日期
,并相应地调整
日期时间
对象格式。这是同一个问题吗?
import pandas as pd
datelist = pd.date_range(start = pd.datetime(2016, 1, 1, 0),
                         end = pd.datetime(2016, 1, 2, 0),
                         freq = "H")