Python获取指定时间内的所有日期

 这里介绍两种获取指定时间内的所有日期的方法,附样例参考。

一种是使用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']

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amour_柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值