in

如何使用 Python 和 Dateparser 解析日期字符串

如何使用 Python 和 Dateparser 解析日期字符串

网络抓取时解析日期时间字符串是最常见的挑战之一,因为网络充满了不同的日期和时间格式。

在本文中,我们将了解一个名为dateparser的 Python 包,它可以自动解析几乎任何文本格式的日期时间字符串。

什么是日期解析器?

Dateparser 是一个用于 Python 的智能日期和时间文本解析库。这是一个流行的社区包,可以datetime从几乎任何包含日期或时间数据的文本中提取真实对象。

如何使用日期解析器?

Dateparser 的关键功能是dateparser.parse函数。

它采用任何字符串作为参数并尝试在其中查找任何日期时间数据。例如,假设我们从网站上抓取了一堆日期字符串,然后将它们放入 dateparser:

import dateparser

# Parsing dates in different formats
dates_in_different_formats = [
    "2023-06-07",    # ISO 8601 format
    "06/07/2023",    # US format
    "07/06/2023",    # European format
    "June 7, 2023",  # Long format
    "7 Jun 2023",    # Another common format
    "2023-06-07T15:25:10", # ISO 8601 with time
    "2023-06-07 15:25:10", # Space separated date and time
    "2023-06-07 15:25:10.555", # Time with milliseconds
]

for date_string in dates_in_different_formats:
    parsed_date = dateparser.parse(date_string)
    print(f"Original: {date_string}\n  Parsed: {parsed_date}")
"""
Original: 2023-06-07
  Parsed: 2023-06-07 00:00:00
Original: 06/07/2023
  Parsed: 2023-06-07 00:00:00
Original: 07/06/2023
  Parsed: 2023-07-06 00:00:00
Original: June 7, 2023
  Parsed: 2023-06-07 00:00:00
Original: 7 Jun 2023
  Parsed: 2023-06-07 00:00:00
Original: 2023-06-07T15:25:10
  Parsed: 2023-06-07 15:25:10
Original: 2023-06-07 15:25:10
  Parsed: 2023-06-07 15:25:10
Original: 2023-06-07 15:25:10.555
  Parsed: 2023-06-07 15:25:10.555000
"""

使用 Dateparser 我们可以解析所有这些不同的格式,而无需自己明确指定任何日期时间格式,这使得在网络抓取时的日期解析更容易访问。

常见问题

日期时间对象仍然很复杂并且高度上下文相关。因此,并非所有问题都可以在不指定解析首选项的情况下由 Dateparser 自动解决。以下是 Dateearser 遇到的主要问题以及如何使用 dateparser 设置解决这些问题。

日期对象顺序

使用 Dateparser 解析日期时间字符串的最常见问题是它无法解析日期对象顺序不明确的日期。

例如,如果我们有一个日期,07/06/2023就不可能知道它是 6 月 7 日还是 7 月 6 日。为了解决这个问题,DATE_ORDER可以使用设置:

import dateparser

# Day first and year first dates
dates = [
    "13/06/2023",
    "06/13/2023",
    "23/06/13",
    "13/06/23",
    "2023/06/13",
]

# Parsing with 'DMY' order
print("Parsing with 'DMY' order")
for date_string in dates:
    parsed_date = dateparser.parse(date_string, settings={'DATE_ORDER': 'DMY'})
    print(f"Original: {date_string}, Parsed: {parsed_date}")

# Parsing with 'YMD' order
print("\nParsing with 'YMD' order")
for date_string in dates:
    parsed_date = dateparser.parse(date_string, settings={'DATE_ORDER': 'YMD'})
    print(f"Original: {date_string}, Parsed: {parsed_date}")
"""
Parsing with 'DMY' order
Original: 13/06/2023, Parsed: 2023-06-13 00:00:00
Original: 06/13/2023, Parsed: None
Original: 23/06/13, Parsed: 2013-06-23 00:00:00
Original: 13/06/23, Parsed: 2023-06-13 00:00:00
Original: 2023/06/13, Parsed: None

Parsing with 'YMD' order
Original: 13/06/2023, Parsed: 2023-06-13 00:00:00
Original: 06/13/2023, Parsed: 2023-06-13 00:00:00
Original: 23/06/13, Parsed: 2023-06-13 00:00:00
Original: 13/06/23, Parsed: 2013-06-23 00:00:00
Original: 2023/06/13, Parsed: 2023-06-13 00:00:00
"""

日期顺序通常可以通过地理位置或被抓取网站的语言来猜测。例如,美国网站通常使用 MDY 格式,而世界其他地方则使用 DMY 或 YMD 格式。

处理隐式时区

许多被抓取的网站经常使用隐式时区。例如,如果我们抓取一个显示与纽约相关的内容的网站,则抓取的日期时间字符串很可能是纽约时间。

为此,可以使用以下TIMEZONE设置手动指定时区:

import dateparser

dateparser.parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern'})
datetime.datetime(2012, 1, 12, 22, 0)

parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': '+0500'})
datetime.datetime(2012, 1, 12, 22, 0)

不完整的日期

某些日期时间字符串可能隐式不完整。例如,如果我们抓取“2024年 12 月”,我们并不知道确切的日期。为此,PREFER_DAY_OF_MONTH可以使用设置:

import dateparser
dateparser.parse('December 2023')  # default behavior is today's date:
datetime.datetime(2023, 12, 16, 0, 0)

dateparser.parse('December 2023', settings={'PREFER_DAY_OF_MONTH': 'last'})
datetime.datetime(2023, 12, 31, 0, 0)
dateparser.parse('December 2023', settings={'PREFER_DAY_OF_MONTH': 'first'})
datetime.datetime(2023, 12, 1, 0, 0)

对于隐含年份的情况,PREFER_DATES_FROM可以使用以下设置:

import dateparser

# default implies the date is from the current year
dateparser.parse('March')
datetime.datetime(2023, 3, 7, 0, 0)

# to imply the date is from the future
dateparser.parse('March', settings={'PREFER_DATES_FROM': 'future'})
datetime.datetime(2024, 3, 7, 0, 0)

# to imply the date is from the past
dateparser.parse('March', settings={'PREFER_DATES_FROM': 'past'})
datetime.datetime(2022, 3, 7, 0, 0)

概括

Dateparser 是一个用于解析日期时间字符串的强大库。它可以解析多种不同格式的日期,而无需自己指定任何日期时间格式。它还具有许多可用于处理隐式时区和不完整日期等常见问题的设置。

要在网络抓取中查看 Dateparser 的真实示例,请参阅我们的如何抓取 ebay教程,其中我们使用 Dateparser 来解析 Ebay 列表中使用的日期。

Written by 河小马

河小马是一位杰出的数字营销行业领袖,广告中国论坛的重要成员,其专业技能涵盖了PPC广告、域名停放、网站开发、联盟营销以及跨境电商咨询等多个领域。作为一位资深程序开发者,他不仅具备强大的技术能力,而且在出海网络营销方面拥有超过13年的经验。