如何在Python中将字符串转换为日期时间

导航至

在编程语言中,在文本和与日期和时间相关的类型之间进行转换是一项常见的任务,Python当然也不例外。这就是为什么在这篇文章中,我们将为您呈现一个字符串到日期时间的Python转换教程。

我们将首先简要概述Python中的字符串和日期时间类型。Python动态类型的本质可能会导致在类型之间的转换需求上产生困惑。因此,在概述之后,我们将解释为什么需要进行此类转换。

在解决这个问题之后,我们将向您介绍Python中的datetime模块。然后,我们将进入实践环节:我们将向您展示如何进行日期和时间的转换。

先决条件

您想跟随文章进行操作吗?为此,您需要安装Python 3.x,并且至少熟悉该语言。

字符串和日期时间:概述

首先,让我们澄清一点:在Python中,(几乎)一切都是对象。因此,与其它主要编程语言不同,Python没有原始类型的概念。诸如数字、日期和字符串等事物与您从类中实例化的对象在相同的意义上是对象。

首先,让我们看看字符串。根据Python的文档:“字符串是不可变的Unicode码点序列。”字符串由str类型表示。

datetime模块包含与处理日期和时间相关的几个类型。Python中日期和时间的一个重要特点是naive对象和aware对象的概念。naive对象是没有时区概念的。它们只是没有绑定到任何特定区域的日期/时间。

另一方面,aware对象则具有时区信息。

为什么Python中的字符串到日期时间转换很重要

您可能已经知道Python具有动态类型,这意味着变量的类型在开发时并非固定不变。例如,您可以在将一个数字分配给变量之后立即将一个字符串分配给它

value = "Some text"
print(type(value))
value = 10
print(type(value))

动态类型的一个重要后果是,您可以传递任何类型的值作为函数的参数,即使您使用了类型提示。考虑到这一点,一个初学者可能会问,为什么要进行字符串到日期时间的转换。难道您不能直接使用日期字符串吗?这种转换有多个合理的理由

  • 正确性。世界上有各种各样的日期格式。对于需要本地化的程序,将日期作为字符串可能会产生错误和维护困难。

  • 性能。日期时间对象是为了以最有效的方式处理日期问题而创建的,这意味着选择字符串可能会使您应用程序的性能受到影响。

  • 代码质量。有一些方法和函数针对日期时间对象进行操作,提供与时间相关的功能。如果您将日期存储在字符串中,您将无法访问这些功能,必须自己编写代码,这可能会产生错误,并生成需要测试、维护和记录的更多代码。

关于最后一点,下面是如何给日期添加天数的示例

from datetime import datetime, date, timedelta
today = datetime.today()
dayAfterTomorrow = today + timedelta(days=1)
print(dayAfterTomorrow)

简而言之,如果您选择不使用datetime及其相关类型,您将最终创建性能较低、安全性较差、可维护性较差的替代品。

Python中的Datetime模块:简介

正如您所看到的,Python中的datetime模块是您用来处理日期和时间问题的模块。它包含几个类,但以下是最主要的几个

  • date:仅包含日期信息,不包含一天中的时间,它是一个无知的对象
  • time:仅包含时间信息,不与任何特定日期绑定
  • datetime:日期、时间和时区的组合(即有意识的类型)
  • tzinfo:包含时区信息

有关datetime模块的更多信息,请参阅官方文档

Python中字符串到日期时间的转换:实战教程

到目前为止,我们已经涵盖了

  • Python中的字符串和datetime类型
  • 为什么将字符串转换为datetime很重要
  • Python中的datetime模块是什么以及它包含什么

在了解了这些基础知识之后,让我们进入文章的实践部分。

如何在Python中将字符串转换为datetime对象?

让我们首先了解最基本的情况。假设您有一个包含ISO-8601格式的日期的字符串

today = "2023-08-26"

要开始转换,首先您必须导入datetime模块。由于我们只有日期没有时间,所以您只需导入日期对象

from datetime import date

要执行转换,您将使用datetime类上的fromisoformat类方法

today_object = date.fromisoformat(today)

为了确保转换正常工作,您可以打印新对象的类型。完整的代码现在看起来是这样的

from datetime import date

today = "2023-08-26"
today_object = date.fromisoformat(today)
print('Type of string variable:',type(today))
print('Type of date variable:',type(today_object))

您不会总是这么幸运,您的日期就是ISO格式。如前所述,有各种不同的日期格式。以下示例将一个字符串转换为日期对象,假设日期是在dd/mm/yyyy格式中

Type of string variable: <class 'str'>

Type of date variable: <class 'datetime.date'>

您不会总是这么幸运,您的日期就是ISO格式。如前所述,有各种不同的日期格式。以下示例将一个字符串转换为日期对象,假设日期是在dd/mm/yyyy格式中

from datetime import datetime
date_string = "26/08/2023"
date_format = "%d/%m/%Y"    

date_object = datetime.strptime(date_string, date_format).date()
print('Type of resulting object:', type(date_object))
print(date_object)

上面的代码中有几个有趣的地方

  • 注意我们使用字符串定义格式
  • 这次,我们使用了strptime方法来转换字符串,将我们之前定义的格式作为第二个参数提供。
  • strptime方法返回一个datetime对象,我们调用它的date()方法来获取一个仅包含日期成分的对象。

运行上述代码,您将看到以下结果

Type of resulting object: <class 'datetime.date'>

2023-08-26

请注意,当我们为 print 函数传递 日期 对象时,它默认使用 ISO-8601 格式进行格式化。

在 Python 中将字符串转换为日期时间的模块或包有哪些?

到目前为止,我们已经将字符串转换为 日期 对象。现在让我们将它们转换为 datetime 对象。

第一步是确保您已从 datetime 模块导入 datetime 类型,如下所示

from datetime import datetime

然后,让我们定义一个日期和格式,就像上一个例子一样

date_string = "26/08/2023"

date_format = "%d/%m/%Y"

这里事情发生了变化。我们将像以前一样进行转换,但不需要在最后调用 date() 方法

date_object = datetime.strptime(date_string, date_format)

print('Type of resulting object:', type(date_object))

print(date_object)

现在,运行脚本后,我们得到以下结果

Type of resulting object: <class 'datetime.datetime'<

2023-08-26 00:00:00

如您所见,结果类型现在是 datetime,而不是仅仅的 date。此外,由于输入字符串不包含任何时间,print() 函数显示时间部分全部为零。

如何在 Python 中将字符串转换为 datetime 时处理不同的日期和时间格式?

如您所见,strptime 方法接受一个字符串作为第二个参数,该参数指输入日期的格式。但是,如果提供的字符串不匹配该模式,会发生什么?当然,在实际应用中,您必须考虑到这种可能性。以下示例展示了如何测试输入字符串的几个不同格式可能性,并在没有格式匹配时处理错误。

from datetime import datetime

date_string = "26/08/2023 18:14:00"

possible_formats = [
    "%d/%m/%Y %H:%M:%S",
    "%Y-%m-%d %H:%M:%S",
    "%m/%d/%Y %H:%M:%S",
    "%d/%m/%Y",
    "%Y-%m-%d"
]

parsed_datetime = None

for date_format in possible_formats:
    try:
        parsed_datetime = datetime.strptime(date_string, date_format)
        break
    except ValueError:
        pass

if parsed_datetime is not None:
    print("Parsed datetime:", parsed_datetime)
else:
    print("Unable to parse datetime with any of the formats")

结论

Python 因其易于上手而被熟知。其简洁性使其成为一款优秀的入门语言。这种简洁性在处理日期和时间问题时尤为明显:只需导入 datetime 模块,您就可以轻松地使用所有可用的类型。

在这篇文章中,我们为您介绍了 Python 中的 datetime。您已经了解到为什么从字符串转换为 datetime 很重要,并学习了如何轻松完成转换。然而,我们只是触及了 Python 提供的所有日期和时间功能的一角。作为下一步,继续探索 Python 的文档,了解日期、时间、datetime 以及所有其他可用类型。您还可以查看以下资源

本文由 Carlos Schults 撰写。 Carlos 是一位顾问和软件开发工程师,拥有桌面、网络和移动开发经验。虽然他的主要语言是 C#,但他对多种语言和平台都有经验。他的主要兴趣包括自动化测试、版本控制和代码质量。