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
相关产品推荐
相关产品推荐

