这里介绍两种获取指定时间内的所有日期的方法,附样例参考。
一种是使用pandas库的date_range方式,使用pandas库的date_range方法生成日期间隔里的所有日期, start, end, periods和freq必须指定三个。
一种是自己定义的方法,获取指定日期内的所有日期,可指定周期, 至少返回两条日期。仅供参考,如果有不完美的地方,欢迎指出。
方法一:
import pandas as pd
def get_date_range1(start, end, periods=2, freq='7D', format='%Y-%m-%d %H:%M:%S'):
"""
使用pandas库的date_range方法生成日期间隔里的所有日期, start, end, periods和freq必须指定三个
:param start: 起始日期
:param end: 结束日期
:param periods: 周期
:param freq: 时间间隔
:param format: 格式化输出
:return: 日期list
"""
periods = None if start and end else periods
date_list = pd.date_range(start=start, end=end, periods=periods, freq=freq)
if len(date_list) < 2:
date_list = date_list.union(date_list.shift(1)[-1:])
return [item.strftime(format) for item in date_list]
print(get_date_range1("2022-01-01 00:00:00", None))
# ['2022-01-01 00:00:00', '2022-01-08 00:00:00']
print(get_date_range1("2022-01-01 00:00:00", "2022-01-06 00:00:00"))
# ['2022-01-01 00:00:00', '2022-01-08 00:00:00']
print(get_date_range1(None, "2022-01-01 00:00:00"))
# ['2021-12-25 00:00:00', '2022-01-01 00:00:00']
# 如果end刚好不在freq内,则输出的结果里不包含最后的日期
print(get_date_range2("2022-01-01 00:00:00", "2022-02-01 00:00:00"))
# ['2022-01-01 00:00:00', '2022-01-08 00:00:00', '2022-01-15 00:00:00', '2022-01-22 00:00:00', '2022-01-29 00:00:00']
方法二:
import datetime
def get_date_range2(begin_date, end_date, freq=7, format='%Y-%m-%d %H:%M:%S', include_end=True):
"""
获取指定日期内的所有日期,可指定周期, 至少返回两条日期
:param begin_date: 起始日期
:param end_date: 结束日期
:param freq: 时间间隔
:param format: 格式化输出
:param include_end: 是否包含最后日期,为False则计算到end_date前一天的日期
:return:
"""
date_list = []
now = datetime.datetime.now()
begin_ = now + datetime.timedelta(days=-freq)
end_ = now.strftime(format)
if not begin_date and not end_date:
# 如果begin_date和end_date都为None,则返回今天和上一个周期的日期
return [begin_, end_]
if not begin_date:
# 如果没有起始日期,获取今天之前一个周期的日期
begin_date = begin_
if not end_date:
# 如果没有结束日期,获取今天的日期
end_date = end_
begin_ = begin_date if isinstance(begin_date, datetime.datetime) else datetime.datetime.strptime(str(begin_date), format)
end_ = end_date if isinstance(end_date, datetime.datetime) else datetime.datetime.strptime(str(end_date), format)
if begin_ >= end_:
# 如果起始日期大于结束日期,起始日期改为上一个周期
begin_ = end_ + datetime.timedelta(days=-freq)
if not include_end:
# 如果不包含结束日期,获取end的前一天
end_ = end_ + datetime.timedelta(days=-1)
while begin_ < end_:
# 遍历起始和结束的日期直到起始日期大于等于end结束
if format:
date_str = begin_.strftime(format)
date_list.append(date_str)
else:
date_list.append(begin_)
begin_ = begin_ + datetime.timedelta(days=freq)
# 添加结束日期
if format:
date_list.append(end_.strftime(format))
else:
date_list.append(end_)
return date_list
print(get_date_range2("2022-01-01 00:00:00", "2022-02-01 00:00:00"))
# ['2022-01-01 00:00:00', '2022-01-08 00:00:00', '2022-01-15 00:00:00', '2022-01-22 00:00:00', '2022-01-29 00:00:00', '2022-02-01 00:00:00']
print(get_date_range2("2022-06-01 00:00:00", None))
# ['2022-06-01 00:00:00', '2022-06-08 00:00:00', '2022-06-14 14:17:23']
print(get_date_range2(None, "2022-06-01 00:00:00"))
# ['2022-05-25 00:00:00', '2022-06-01 00:00:00']