Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。
本系列将会陆续整理分享一些有趣、有用的第三方库。
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/Python_Ecosystem
-
支持几乎所有现有的日期格式:绝对日期、相对日期(如“两周前”或“明天”)、时间戳等; -
支持超过200种语言和地区设置; -
语言自动检测; -
通过设置自定义行为; -
支持非格里高利历系统,如波斯历(Jalali)和伊斯兰历(Hijri); -
支持带时区缩写或UTC偏移的日期; -
在长文本中搜索日期。
pip install dateparser
pip install dateparser[calendars]
https://github.com/scrapinghub/dateparser
最直接的方式是使用dateparser.parse()函数,该函数封装了模块的大部分功能,从给定的日期字符串中解析日期和时间。
dateparser.parse(
date_string,
date_formats=None,
languages=None,
locales=None,
region=None,
settings=None,
detect_languages_function=None
)
-
date_string (str/list):一个以可识别的有效格式表示日期和/或时间的字符串或字符串列表。 -
languages (list):语言代码列表,例如 [‘en’, ‘es’, ‘zh-Hant’]。如果没有给出本地语言,则使用语言和地区来构建翻译用的本地语言。 -
locales (list):地区设置代码列表,例如 [‘fr-PF’, ‘qu-EC’, ‘af-NA’]。 解析器仅使用这些地区设置来翻译日期字符串。 -
region (str):地区代码,例如 ‘IN’、’001’、’NE’。 如果未提供地区设置,则会根据语言和地区构建地区设置以进行翻译。 -
settings (dict):使用 dateparser.conf.Settings 中定义的设置来配置自定义行为。 -
detect_languages_function (function):一个语言检测函数,输入为字符串(日期字符串)和置信度阈值,返回检测到的语言代码列表。仅在未提供 languages 和 locales 时使用此函数。
返回值:
如果解析成功,返回表示解析日期的 datetime 对象;否则返回 None。
-
2.1 解析简单日期字符串:
# 解析英文日期字符串
date = dateparser.parse('January 1, 2025')
print(date)
# 输出: 2025-01-01 00:00:00
# 解析中文日期字符串
date = dateparser.parse('2025年2月15日')
print(date)
# 输出: 2025-02-15 00:00:00
# 解析不完整日期格式
# 基于语言的默认日期顺序偏好进行解析,假设为英语,将使用 MDY 日期顺序
date = dateparser.parse('10/11/12')
print(date)
# 输出: 2012-10-11 00:00:00
# 解析包含星期、日期、时间信息的英文日期字符串
date = dateparser.parse('Fri, 12 Dec 2014 10:55:50')
print(date)
# 输出: 2014-12-12 10:55:50
如果知道语言,可以使用 languages 参数指定。在这种情况下,将使用给定的语言,跳过语言检测。
# 指定语言
date = dateparser.parse('2015, Ago 15, 1:08 pm', languages=['pt', 'es'])
print(date)
# 输出: 2015-08-15 13:08:00
# 解析不完整日期格式
# 基于语言的默认日期顺序偏好进行解析,检测到法语将使用 DMY 日期顺序(与英语 MDY 格式不同)
date = dateparser.parse('10/11/12', languages=['fr'])
print(date)
# 输出: 2012-11-10 00:00:00
如果知道日期的可能格式,可以使用 date_formats 参数指定日期字符串的具体格式,以此来更准确地解析像 ’10/11/12′ 这种有歧义的日期字符串。
# 指定日期字符串的具体格式
date = dateparser.parse('10/11/12', date_formats=['%d/%m/%y'])
print(date)
# 输出: 2012-11-10 00:00:00
-
2.2 解析相对日期:
# 解析相对日期
date = dateparser.parse('yesterday')
print(date)
# 输出: 2025-02-16 22:39:02.513951
date = dateparser.parse('明天')
print(date)
# 输出: 2025-02-18 22:39:02.624882
date = dateparser.parse('1周前')
print(date)
# 输出: 2025-02-10 22:39:02.635942
-
2.3 处理时区:
默认情况下,如果日期字符串中包含时区,则 dateparser 返回带时区信息的 datetime 对象;否则返回不带时区信息的 datetime 对象。
# 解析带时区的日期字符串
date = dateparser.parse('2012年1月12日 22:00 -0500')
print(date)
# 输出:2012-01-12 22:00:00-05:00
-
2.4自定义解析设置:
parse方法中的settings参数允许你对日期解析过程进行更精细的自定义设置。
# 定义一个字典 settings,用于存储 dateparser 解析日期时的自定义设置
settings = {
# 设置 PREFER_DATES_FROM 参数为 'current_period',表示在解析相对日期时,优先从当前时间段考虑
'PREFER_DATES_FROM': 'current_period',
# 设置 TIMEZONE 参数为 'Asia/Shanghai',表示将解析后的日期和时间调整为上海时区
'TIMEZONE': 'Asia/Shanghai'
}
date = dateparser.parse('next week', settings=settings)
print(date)
# 输出:2025-02-24 22:42:03.675998
-
2.5不完整的日期:
# 对不完整日期的解析
date = dateparser.parse('2015年12月') # 默认行为,使用当前的日期补充
print(date)
# 输出:2015-12-17 00:00:00
# 设置 'PREFER_DAY_OF_MONTH' 为 'last',优先选择该月的最后一天来补充日期
date = dateparser.parse('2015年12月', settings={'PREFER_DAY_OF_MONTH': 'last'})
print(date)
# 输出:2015-12-31 00:00:00
# 设置 'PREFER_DAY_OF_MONTH' 为 'first',优先选择该月的第一天来补充日期
date = dateparser.parse('2015年12月', settings={'PREFER_DAY_OF_MONTH': 'first'})
print(date)
# 输出:2015-12-01 00:00:00
# 对不完整日期的解析
date = dateparser.parse('3月') # 默认行为,使用当前的日期补充
print(date)
# 输出:2025-03-17 00:00:00
# 设置 'PREFER_DATES_FROM' 为 'future',优先从未来的时间范围去补充缺少的年份信息
date = dateparser.parse('3月', settings={'PREFER_DATES_FROM': 'future'})
print(date)
# 输出:2025-03-17 00:00:00
# 设置 'PREFER_DATES_FROM' 为 'past',优先从过去的时间范围去补充缺少的年份信息
date = dateparser.parse('3月', settings={'PREFER_DATES_FROM': 'past'})
print(date)
# 输出:2024-03-17 00:00:00
# 对不完整日期的解析
date = dateparser.parse("2015") # 默认行为,使用当前的日期补充
print(date)
# 输出:2015-02-17 00:00:00
# 设置 'PREFER_MONTH_OF_YEAR' 为 'last',优先选择该年的最后一个月(12 月)来补充日期
date = dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "last"})
print(date)
# 输出:2015-12-17 00:00:00
# 设置 'PREFER_MONTH_OF_YEAR' 为 'first',优先选择该年的第一个月(1 月)来补充日期
date = dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "first"})
print(date)
# 输出:2015-01-17 00:00:00
# 设置 'PREFER_MONTH_OF_YEAR' 为 'current',优先选择当前的月份来补充日期
date = dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "current"})
print(date)
# 输出:2015-02-17 00:00:00
也可以通过设置 STRICT_PARSING 为True,完全忽略对不完整日期的解析:
# 忽略对不完整日期的解析
date = dateparser.parse('2015年12月', settings={'STRICT_PARSING': True})
print(date)
# 输出:None
dateparser.search.search_dates(
text,
languages=None,
settings=None,
add_detected_language=False,
detect_languages_function=None
)
参数说明:
-
text (str):一个可能包含日期和/或时间表达式的自然语言字符串。
-
languages (list):两字母语言代码列表,例如 [‘en’, ‘es’]。如果提供了语言,则不会尝试检测语言。
-
settings (dict):使用 dateparser.conf.Settings 中定义的设置来配置自定义行为。
-
add_detected_language (bool):是否将检测到的语言返回在元组中。
-
detect_languages_function (function):一个语言检测函数,输入为文本和置信度阈值,返回检测到的语言代码列表。仅在未提供语言时使用此函数。
返回值:
返回包含以下内容的元组列表:
-
表示日期和/或时间的子字符串对应的 datetime.datetime 对象,
-
如果 add_detected_language 为 True,则返回检测到的语言。
-
如果没有可以解析的日期,则返回 None。
from dateparser.search import search_dates
# 默认情况会检测成日语(ja)
date = search_dates("客户首次于2004年3月3日来到办公室,几周后,于2004年5月6日再次光临,表示零件存在缺陷。" , add_detected_language=True , languages=['zh'])
print(date)
# 输出:[('2004年3月3', datetime.datetime(2004, 3, 3, 0, 0), 'zh'), ('后,于2004年5月', datetime.datetime(2004, 5, 6, 0, 0), 'zh')]
更多内容可以前往官方文档查看:
https://dateparser.readthedocs.io/en/latest/


本篇文章来源于微信公众号: 码农设计师