Python 按天将日期范围与时间分割

Python 按天将日期范围与时间分割,python,algorithm,datetime,Python,Algorithm,Datetime,随着时间的推移,我有一系列的约会。 例如: 我想得到这样一个拆分: diapason = [(2020-11-02 17:40, 2020-11-03 00:00), (2020-11-03 00:00, 2020-11-04 00:00), (2020-11-04 00:00, 2020-11-05 00:00), (2020-11-05 00:00, 2020-11-05 10:00)] 我该怎么做?到目前为止,我只设法除以24小时,如下所示: from datetime import d

随着时间的推移,我有一系列的约会。 例如:

我想得到这样一个拆分:

diapason = [(2020-11-02 17:40, 2020-11-03 00:00), (2020-11-03 00:00, 2020-11-04 00:00), (2020-11-04 00:00, 2020-11-05 00:00), (2020-11-05 00:00, 2020-11-05 10:00)]
我该怎么做?到目前为止,我只设法除以24小时,如下所示:

from datetime import datetime,timedelta
diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]

start = datetime.strptime(diapason[0], "%Y-%m-%d %H:%M")
end = datetime.strptime(diapason[1], "%Y-%m-%d %H:%M")
r = [(start + timedelta(days=i)).strftime("%Y-%m-%d %H:%M:%S.%f") for i in range(0, (end-start).days, 1)]

print(r)

首先生成所有可能的日期并添加开始和结束时间戳。对它们进行排序,最后迭代以获得所有可能的时间戳。 这里有一个例子:

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]
start = datetime.strptime(diapason[0], "%Y-%m-%d %H:%M")
end = datetime.strptime(diapason[-1], "%Y-%m-%d %H:%M")

dates = [datetime.strptime(str(date), "%Y-%m-%d %H:%M:%S") for date in pd.date_range(start.date() + timedelta(1), end.date())] + [start, end]
dates = sorted(dates)

diapason = []
for i in range(len(dates)-1):
    diapason.append((dates[i], dates[i+1]))

这给了你:

[(datetime.datetime(2020, 11, 2, 17, 40), datetime.datetime(2020, 11, 3, 0, 0)),
 (datetime.datetime(2020, 11, 3, 0, 0), datetime.datetime(2020, 11, 4, 0, 0)),
 (datetime.datetime(2020, 11, 4, 0, 0), datetime.datetime(2020, 11, 5, 0, 0)),
 (datetime.datetime(2020, 11, 5, 0, 0), datetime.datetime(2020, 11, 5, 10, 0))]
然后,您可以将其转换为字符串,或者根据需要重新格式化。

您可以使用:

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]

start = datetime.strptime(diapason[0], "%Y-%m-%d %H:%M")
end = datetime.strptime(diapason[1], "%Y-%m-%d %H:%M")

def d(date): return timedelta(hours=date.hour, minutes=date.minute, seconds=date.second)

r = [(start - d(start) + timedelta(days=i)).strftime("%Y-%m-%d %H:%M:%S.%f") for i in range(1, (end-start).days + 2)]
r = r + diapason
r.sort()
print(r)
这给了你

['2020-11-02 17:40',
 '2020-11-03 00:00:00.000000',
 '2020-11-04 00:00:00.000000',
 '2020-11-05 00:00:00.000000',
 '2020-11-05 10:00']

创建一个包含列表元素的日期范围,用开始/结束日期时间替换第一个和最后一个元素,并格式化为字符串元组:

from datetime import datetime, timedelta

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]
start, end = [datetime.fromisoformat(d) for d in diapason]

output = [[start.date()+timedelta(d), start.date()+timedelta(d+1)] for d in range((end-start).days + 2)]
output[0][0], output[-1][-1] = start, end

output = [(l[0].strftime('%Y-%m-%d %H:%M'), l[1].strftime('%Y-%m-%d %H:%M')) for l in output]

# output
# [('2020-11-02 17:40', '2020-11-03 00:00'),
#  ('2020-11-03 00:00', '2020-11-04 00:00'),
#  ('2020-11-04 00:00', '2020-11-05 00:00'),
#  ('2020-11-05 00:00', '2020-11-05 10:00')]

我不确定我是否理解你的问题。你是不是希望你的间歇时间是从一天的午夜到第二天的午夜?(加上第一次和最后一次间隔)。如果是这种情况,您是否考虑过使用
00:00
小时创建
start
end
,执行for循环,然后分别为原始
diapason[0]
diapason[1]
替换第一个和最后一个间隔的第一项。基本上你创建了从午夜到午夜的24小时时段,然后调整了第一个和最后一个时段。是的,你正确理解了我的问题,好主意,现在我来试试
from datetime import datetime, timedelta

diapason = ["2020-11-02 17:40", "2020-11-05 10:00"]
start, end = [datetime.fromisoformat(d) for d in diapason]

output = [[start.date()+timedelta(d), start.date()+timedelta(d+1)] for d in range((end-start).days + 2)]
output[0][0], output[-1][-1] = start, end

output = [(l[0].strftime('%Y-%m-%d %H:%M'), l[1].strftime('%Y-%m-%d %H:%M')) for l in output]

# output
# [('2020-11-02 17:40', '2020-11-03 00:00'),
#  ('2020-11-03 00:00', '2020-11-04 00:00'),
#  ('2020-11-04 00:00', '2020-11-05 00:00'),
#  ('2020-11-05 00:00', '2020-11-05 10:00')]