在python中,如何创建一个列表列表,其中每个列表都包含开始和结束日期的字符串表示



我想要的输出是:

date_list = [
['2021-04-15', '2021-04-20'],
['2021-04-21', '2021-04-26'],
['2021-04-27', '2021-05-02'],
['2021-05-03', '2021-05-08'],
['2021-05-09', '2021-05-16'],
]

我希望能够定义start_date('2021-04-15'(、end_date('021-05-16'(和一个整数,该整数表示我希望在每个区块中有多少天(例如,我希望每个子列表包含一个5天的区块(。我还需要确保end_date包含在最后一个列表/块中,而不管该块的大小如何。我需要能够使用每个列表的元素来参数化SQL循环,并且已经尝试了许多解决方案,但没有一个能接近我想要的。

这将起作用:

import datetime
import pandas as pd
def get_date_chunks(start_date, end_date, chunk_size):
curr = datetime.datetime.strptime(start_date, "%Y-%m-%d")
end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")
offset = pd.DateOffset(days=chunk_size)
result = []
while curr <= end_date:
result.append([str(curr.date()), str((curr + offset).date())])
curr += pd.DateOffset(days = chunk_size + 1)

# Make sure last date matches up with the end_date
if datetime.datetime.strptime(result[-1][0], "%Y-%m-%d") > end_date:
result.pop()
else:
result[-1][1] = str(end_date.date())
return result 

get_date_chunks('2021-04-15', '2021-05-16', 5)

此行:

if datetime.datetime.strptime(result[-1][0], "%Y-%m-%d") > end_date:

意味着你的最终列表可能是['2021-05-15', '2021-05-15'],这意味着你将永远包括结束日期,但你永远不会看到超过结束日期的一天。

>>> import datetime
>>> start = datetime.datetime(year=2021, month=4, day=15)
>>> end = datetime.datetime(year=2021, month=5, day=16)
>>> delta = datetime.timedelta(days=5)
>>> result = []
>>> while start <= end:
result.append([start.strftime('%Y-%m-%d'), (start+delta).strftime('%Y-%m-%d')])
start += delta + datetime.timedelta(days=1)
>>> result
[['2021-04-15', '2021-04-20'],
['2021-04-21', '2021-04-26'],
['2021-04-27', '2021-05-02'],
['2021-05-03', '2021-05-08'],
['2021-05-09', '2021-05-14'],
['2021-05-15', '2021-05-20']]

这个函数完全按照您在所需输出中指定的方式执行。如果最后一个区块小于5,它只需将其与前一个区块联合起来。

import datetime
from dateutil import parser
def create_date_list(start_date, end_date, chunk_size):
start_date = parser.parse(start_date)
end_date = parser.parse(end_date)

dates = []

i = 0
while True:
chunk_start = start_date + i*datetime.timedelta(chunk_size) + datetime.timedelta(i)
chunk_end = chunk_start + datetime.timedelta(chunk_size)
if (end_date - chunk_end).days <= chunk_size:
dates.append([str(chunk_start).split()[0], str(end_date).split()[0]])
break
else:
dates.append([str(chunk_start).split()[0], str(chunk_end).split()[0]])
i += 1

return dates

最新更新