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

导航至

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

我们将首先简要概述 Python 中的字符串和日期时间类型。Python 的动态类型特性可能会让人对类型之间转换的必要性感到困惑。这就是为什么在概述之后,我们将解释为什么这种转换是必要的。

在解决了这个问题之后,我们将继续向您介绍 Python 中的 datetime 模块。然后,终于到了实践的时候:我们将向您展示如何执行日期和时间转换。

先决条件

您想跟随本文一起学习吗?为此,您需要安装 Python 3.x,并且至少熟悉这门语言。

字符串和日期时间:概述

让我们首先弄清楚一件事:在 Python 中,(几乎)一切皆为对象。因此,与其他主要编程语言不同,Python 没有将原始类型视为不同种类工件的概念。数字、日期和字符串等事物与您从创建的类实例化的对象在同一意义上是对象。

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

datetime 模块包含几个与处理时间和日期相关的类型。Python 中日期和时间的一个重要特征是朴素对象和感知对象的概念。朴素对象是不包含任何时区概念的对象。它们只是未绑定到任何特定时区的日期/时间。

另一方面,感知对象确实具有时区信息。

为什么字符串到日期时间 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)

简而言之,如果您选择不使用日期时间和其配套类型,您最终会创建性能较低、安全性较低且可维护性较低的替代品。

Python 中的日期时间模块:简介

如您所见,Python 中的 datetime 模块是您用来处理日期和时间问题的模块。它包含几个类,但这些是主要的类

  • date: 仅包含日期信息,不包含一天中的时间,并且是朴素对象
  • time: 仅包含时间信息,不绑定到任何特定日期
  • datetime: 日期、时间和时区的组合(即,感知类型)
  • tzinfo: 包含时区信息

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

字符串到日期时间 Python 转换:实践教程

到目前为止,我们已经介绍了

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

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

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

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

today = "2023-08-26"

要开始转换,首先您必须导入 datetime 模块。由于我们拥有的只是一个没有时间的日期,因此您只需导入 date 对象

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 方法返回一个日期时间对象,我们在该对象上调用 date() 方法以获取仅包含日期组件的对象。

通过运行上面的代码,您将看到以下结果

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

2023-08-26

另请注意,当我们为 print 函数传递 date 对象时,它使用 ISO-8601 格式作为默认格式。

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

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

第一步是确保您从 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 中将字符串转换为日期时间时处理不同的日期和时间格式?

如您所见,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。您已经了解了为什么从字符串转换为日期时间很重要,并且了解了如何轻松地完成它。但是,当我们谈到 Python 提供的所有日期/时间功能时,我们只是触及了皮毛。作为下一步,继续探索 Python 的文档,了解 date、time、datetime 以及所有其他可用类型。您还可以查看以下一些资源

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