如何将以下字符串转换为datetime对象?

"Jun 1 2005  1:33PM"

当前回答

#Convert String to datetime
>>> x=datetime.strptime('Jun 1 2005', '%b %d %Y').date()
>>> print(x,type(x))
2005-06-01 00:00:00 <class 'datetime.datetime'>


#Convert datetime to String (Reverse above process)
>>> y=x.strftime('%b %d %Y')
>>> print(y,type(y))
Jun 01 2005 <class 'str'>

其他回答

我个人喜欢使用解析器模块的解决方案,这是这个问题的第二个答案,非常漂亮,因为您不必构造任何字符串文字就能使其工作。但是,一个缺点是它比strptime的公认答案慢了90%。

from dateutil import parser
from datetime import datetime
import timeit

def dt():
    dt = parser.parse("Jun 1 2005  1:33PM")
def strptime():
    datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))

输出:

10.702968013429021.3627995655316933

只要你不反复做一百万次,我仍然认为解析器方法更方便,并且可以自动处理大多数时间格式。

这里没有提到但很有用的一点:在当天添加后缀。我解耦了后缀逻辑,这样你就可以将它用于任何你喜欢的数字,而不仅仅是日期。

import time

def num_suffix(n):
    '''
    Returns the suffix for any given int
    '''
    suf = ('th','st', 'nd', 'rd')
    n = abs(n) # wise guy
    tens = int(str(n)[-2:])
    units = n % 10
    if tens > 10 and tens < 20:
        return suf[0] # teens with 'th'
    elif units <= 3:
        return suf[units]
    else:
        return suf[0] # 'th'

def day_suffix(t):
    '''
    Returns the suffix of the given struct_time day
    '''
    return num_suffix(t.tm_mday)

# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))​​​​​​​

如果您不想明确指定字符串相对于日期时间格式的格式,可以使用此黑客绕过该步骤:

from dateutil.parser import parse

# Function that'll guess the format and convert it into the python datetime format
def update_event(start_datetime=None, end_datetime=None, description=None):
    if start_datetime is not None:
        new_start_time = parse(start_datetime)

        return new_start_time

# Sample input dates in different formats
d = ['06/07/2021 06:40:23.277000', '06/07/2021 06:40', '06/07/2021']

new = [update_event(i) for i in d]

for date in new:
    print(date)
    # Sample output dates in Python datetime object
    #   2014-04-23 00:00:00
    #   2013-04-24 00:00:00
    #   2014-04-25 00:00:00

如果要将其转换为其他日期时间格式,只需使用您喜欢的格式修改最后一行,例如date.strftime(“%Y/%m/%d%H:%m:%S.%f”):

from dateutil.parser import parse

def update_event(start_datetime=None, end_datetime=None, description=None):
    if start_datetime is not None:
        new_start_time = parse(start_datetime)

        return new_start_time

# Sample input dates in different formats
d = ['06/07/2021 06:40:23.277000', '06/07/2021 06:40', '06/07/2021']

# Passing the dates one by one through the function
new = [update_event(i) for i in d]

for date in new:
    print(date.strftime('%Y/%m/%d %H:%M:%S.%f'))
    # Sample output dates in required Python datetime object
    #   2021/06/07 06:40:23.277000
    #   2021/06/07 06:40:00.000000
    #   2021/06/07 00:00:00.000000

尝试运行上面的代码段以获得更好的清晰度。

创建一个小的实用程序函数,如:

def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()

这是足够多功能的:

如果不传递任何参数,它将返回今天的日期。有一个日期格式作为默认值,您可以覆盖它。您可以轻松地修改它以返回日期时间。

datetime.strptime将用户指定格式的输入字符串解析为时区原始日期时间对象:

>>> from datetime import datetime
>>> datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
datetime.datetime(2005, 6, 1, 13, 33)

要使用现有的datetime对象获取日期对象,请使用.date()对其进行转换:

>>> datetime.strptime('Jun 1 2005', '%b %d %Y').date()
date(2005, 6, 1)

链接:

strptime文档:Python 2、Python 3strptime/strftime格式字符串文档:Python 2,Python 3strftime.org格式字符串备忘单

笔记:

strptime=“字符串解析时间”strftime=“字符串格式时间”