You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python库需求:将人类可读时间间隔转换为两个datetime对象

人类可读时间转datetime区间的Python库推荐

有几个成熟的Python库能满足你的需求,下面是具体方案:

pendulum库

这是一个功能全面的日期时间处理库,原生支持相对时间解析,能快速生成你需要的时间区间,还能轻松处理时区问题。

示例代码:

import pendulum

def get_time_interval(interval_str):
    now = pendulum.now()
    if interval_str == "today":
        start = now.start_of("day")
        end = now.end_of("day")
    elif interval_str == "yesterday":
        start = now.subtract(days=1).start_of("day")
        end = now.subtract(days=1).end_of("day")
    elif interval_str == "last week":
        # 按周一到周日计算上周区间(可根据需求调整周起始日)
        start = now.start_of("week").subtract(weeks=1)
        end = now.end_of("week").subtract(weeks=1)
    elif interval_str == "last month":
        start = now.start_of("month").subtract(months=1)
        end = now.end_of("month").subtract(months=1)
    elif interval_str == "2 months ago":
        # 取两个月前的当天开始,到昨天结束
        start = now.subtract(months=2).start_of("day")
        end = now.start_of("day").subtract(microseconds=1)
    elif interval_str == "year-to-date":
        start = now.start_of("year")
        end = now.end_of("day")
    else:
        # 兼容更多自定义相对时间字符串
        parsed = pendulum.parse(interval_str, strict=False)
        start = parsed.start_of("day")
        end = now.end_of("day") if "ago" in interval_str else parsed.end_of("day")
    # 转换为Python原生datetime对象返回
    return (start.naive(), end.naive())

# 调用示例
print(get_time_interval("last week"))
# 输出类似: (datetime.datetime(2023, 11, 12, 0, 0), datetime.datetime(2023, 11, 18, 23, 59, 59))

dateparser库

这个库专注于解析自然语言时间字符串,配合原生datetime或dateutil库,也能实现需求,适合处理更多样化的时间表述。

示例代码:

import dateparser
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta  # 用于精确的月份/年份计算

def get_time_interval(interval_str):
    now = datetime.now()
    if interval_str == "today":
        start = now.replace(hour=0, minute=0, second=0, microsecond=0)
        end = now.replace(hour=23, minute=59, second=59, microsecond=999999)
    elif interval_str == "yesterday":
        yesterday = now - timedelta(days=1)
        start = yesterday.replace(hour=0, minute=0, second=0, microsecond=0)
        end = yesterday.replace(hour=23, minute=59, second=59, microsecond=999999)
    elif interval_str == "last week":
        # 计算上周周一到周日的区间
        last_week_start = now - timedelta(days=now.weekday() + 7)
        start = last_week_start.replace(hour=0, minute=0, second=0, microsecond=0)
        end = start + timedelta(days=6, hours=23, minutes=59, seconds=59, microseconds=999999)
    elif interval_str == "last month":
        # 精确计算上月的第一天和最后一天
        last_month_start = (now.replace(day=1) - relativedelta(months=1)).replace(day=1, hour=0, minute=0, second=0, microsecond=0)
        last_month_end = now.replace(day=1) - timedelta(microseconds=1)
        start = last_month_start
        end = last_month_end
    elif interval_str == "2 months ago":
        two_months_ago = now - relativedelta(months=2)
        start = two_months_ago.replace(hour=0, minute=0, second=0, microsecond=0)
        end = now.replace(hour=0, minute=0, second=0, microsecond=0) - timedelta(microseconds=1)
    elif interval_str == "year-to-date":
        start = now.replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0)
        end = now.replace(hour=23, minute=59, second=59, microsecond=999999)
    else:
        parsed_date = dateparser.parse(interval_str)
        if not parsed_date:
            raise ValueError(f"无法解析时间间隔: {interval_str}")
        start = parsed_date.replace(hour=0, minute=0, second=0, microsecond=0)
        end = parsed_date.replace(hour=23, minute=59, second=59, microsecond=999999)
    return (start, end)

# 调用示例
print(get_time_interval("last month"))

内容的提问来源于stack exchange,提问作者Charlie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:15:07