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

2023-09-21 15:27:21

Python 没有内置数据类型date。但是,标准库中的datetime模块定义了datetimedatetime类,使用这些类可以完成与日期和时间相关的处理。 这些类的对象是通过提供整数参数来创建的,如下所示:

dateobj = date(year, month, day)
timeobj = time(hour, minute, second)
datetimeobj = datetime(year, month, day, hour, minute, second)

因此,我们应该能够解析日期/时间的字符串表示并获取上述构造函数的参数。例如,日期的默认字符串表示形式为 'YYYY-MM-DD' ,表示时间'HH:MM:SS''YYYY-MM-DD HH:MM:SS' 表示日期时间。

例如,'2020-10-16 12:35:20' 是表示日期和时间的字符串。我们可以手动分离日期和时间属性并构造datetime对象,如下所示:

>>> strdate="2020-10-16 12:35:20" 
>>> dt_tuple=tuple([int(x) for x in strdate[:10].split('-')])+tuple([int(x) for x in strdate[11:].split(':')])
>>> dt_tuple
(2020, 10, 16, 12, 35, 20)

在上面的日期时间字符串中,前 10 个字符具有由"-"分隔的年、月和日值,其余 8 个字符具有由":"分隔的小时、分钟和秒值。 现在,您可以通过导入日期时间模块来解压缩日期时间构造函数的上述元组,如下所示。

>>> import datetime
>>> datetimeobj=datetime.datetime(*dt_tuple)
>>> datetimeobj
datetime.datetime(2020, 10, 16, 12, 35, 20)

但是,日期和时间的字符串表示形式可能会根据用户的选择而有所不同。例如,可以使用DD-MM-YY格式,或者有人可能希望按名称显示月份,例如 16-Oct-2020

这就是datetime类的strptime()方法被证明有用的地方。

datetime.datetime.strptime(string, format)

第一个参数是字符串表示形式,第二个参数使用预定义的代码从字符串中分析日期和时间值。例如,如果给定的格式为 '%Y-%m-%d',则此函数将解析日期字符串'2020-10-16'。 在这里,%Y使用前四个字符作为一年的四位数表示,中间两个字符作为月份,最后两个字符作为日期。 该模块定义了以下唯一代码,用于根据日期时间字符串的预定义含义设置其格式。

CodeDescription
%aWeekday, short version
%AWeekday, full version
%dDay of month 01-31
%bMonth name, short version
%BMonth name, full version
%mMonth as a number 01-12
%yYear, short version, without century
%YYear, full version
%HHour 00-23
%IHour 00-12
%pAM/PM
%MMinute 00-59
%SSecond 00-59

让我们使用 strptime() 方法将给定字符串转换为 datetime 对象,如下所示:

>>> strdate="2020-10-16 12:35:20" 
>>> datetimeobj=datetime.datetime.strptime(strdate, "%Y-%m-%d %H:%M:%S")
>>> datetimeobj
datetime.datetime(2020, 10, 16, 12, 35, 20)

如果日期字符串更改为 'DD-MM-YY' ,则必须将格式设置为 %d-%m-%Y

>>> strdate="16-10-2020 12:35:20" 
>>> datetimeobj=datetime.datetime.strptime(strdate,"%d-%m-%Y %H:%M:%S")
>>> datetimeobj
datetime.datetime(2020, 10, 16, 12, 35, 20)

最后一个例子,让我们将日期字符串设置为 '16-Oct-20'

>>> strdate="16-Oct-20" 
>>> datetimeobj=datetime.datetime.strptime(strdate,"%d-%b-%y")
>>> datetimeobj
datetime.datetime(2020, 10, 16, 0, 0)

请注意,时间参数显示为 0,因为它们不包含在字符串中。