将字符串 “Jun 1, 2005 1:33PM” 转换为 datetime

Convert string "Jun 1 2005 1:33PM" into datetime

提问人:Oli 提问时间:1/22/2009 最后编辑:cottontailOli 更新时间:5/31/2023 访问量:4535353

问:

我有一大堆日期时间字符串,如下所示

["Jun 1 2005 1:33PM", "Aug 28 1999 12:00AM"]

如何将它们转换为日期时间对象?

python 日期时间

评论

10赞 smci 12/15/2017
除非你确定一种格式可以处理每一个日期时间(没有'',没有NaN,没有不完整,没有格式不匹配,没有尾随字符、时区、微秒时间戳或其他文本......),否则例外的快乐会让你发疯,除非你把它包装起来。看看我的答案,基于Or Weis对此的回答strptime()
0赞 Way Too Simple 11/2/2019
我所知道的最懒惰、最广泛使用的方法是 dateparser(检查 blog.scrapinghub.com/2015/11/09/...)。它甚至可以使用多种语言的自然语言时间表达式,开箱即用。我想它可能会很慢。
0赞 GoingMyWay 1/4/2020
这里有一个有用的链接: stackabuse.com/converting-strings-to-datetime-in-python
1赞 Ben 2/3/2021
datetime.strptime正如其他人所提到的。对于那些喜欢视频解释的人,请参阅此处

答:

515赞 florin 1/22/2009 #1

时间模块中查看 strptime。它是 strftime 的倒数。

$ python
>>> import time
>>> my_time = time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)

评论

18赞 Alexander Bird 9/7/2010
据我了解,这个答案只输出时间对象,而不是日期时间对象——这就是为什么与帕特里克的答案相比,答案会被埋没。
4416赞 Patrick Harrington 1/22/2009 #2

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

>>> 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= “字符串解析时间”
  • strftime= “字符串格式时间”

评论

11赞 jfs 4/29/2014
'%b', '%p' 在非英语区域设置中可能会失败。
1赞 User 4/30/2014
什么是字符串没有时间,只有“2014 年 4 月 25 日”
33赞 Izkata 11/12/2014
@User 您必须提前知道才能排除格式字符串的那部分,但是如果您想要 a 而不是 ,则可以很好地处理它:datedatetimedatetimedatetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
23赞 Flimm 12/8/2016
如果您知道该字符串表示 UTC 中的日期时间,则可以通过在 Python 3 中添加以下行来获取时区感知对象:datetimefrom datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
1赞 hm6 2/5/2022
就我而言,“stackoverflow.com/a/54830426/6784445”答案是更好的匹配,我希望我们是否可以将其作为补充包含在该解决方案中。
1066赞 Simon Willison 1/23/2009 #3

使用第三方 dateutil 库:

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

它可以处理大多数日期格式,并且比通常猜测正确的格式更方便。它对于编写测试也非常有用,其中可读性比性能更重要。strptime

使用以下方式安装它:

pip install python-dateutil

评论

125赞 Paweł Polewicz 7/3/2011
请注意,对于大量数据,这可能不是解决问题的最佳方法。每次猜测格式可能会非常慢。
29赞 brian buck 10/13/2011
这很好,但最好有一个内置的解决方案,而不必去第三方。
2赞 wisbucky 11/14/2021
这非常适合无法保证日期格式的情况。
0赞 theProcrastinator 3/2/2022
如果您有不确定的格式,并且其中一些格式不完整,例如 instead of ,它将假设任何任意日期。没有月份的日期也是如此。June 200912 June 2009
1赞 java-addict301 3/31/2023
拜托。Python 总是吹嘘伟大的标准库。它不能这样做吗?
25赞 Aram Kocharyan 10/14/2011 #4

这里没有提到但有用的东西:为日期添加后缀。我解耦了后缀逻辑,因此您可以将其用于您喜欢的任何数字,而不仅仅是日期。

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"))​​​​​​​
133赞 Steve Peak 3/2/2014 #5

我整理了一个项目,可以转换一些非常简洁的表达式。查看时间字符串

以下是一些示例:

pip install timestring
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))
51赞 Janus Troelsen 3/6/2014 #6

许多时间戳都有一个隐含的时区。为了确保你的代码在每个时区都能工作,你应该在内部使用 UTC,并在每次有外来对象进入系统时附加一个时区。

Python 3.2+:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))

这假设您知道偏移量。如果您不知道,但您知道例如位置,则可以使用软件包查询 IANA 时区数据库的偏移量。我在这里以德黑兰为例,因为它有半小时的偏移量:pytz

>>> tehran = pytz.timezone("Asia/Tehran")
>>> local_time = tehran.localize(
...   datetime.datetime.strptime("March 5, 2014, 20:13:50",
...                              "%B %d, %Y, %H:%M:%S")
... )
>>> local_time
datetime.datetime(2014, 3, 5, 20, 13, 50, tzinfo=<DstTzInfo 'Asia/Tehran' +0330+3:30:00 STD>)

如您所见,已确定该特定日期的偏移量为 +3:30。您现在可以将其转换为 UTC 时间,它将应用偏移量:pytz

>>> utc_time = local_time.astimezone(pytz.utc)
>>> utc_time
datetime.datetime(2014, 3, 5, 16, 43, 50, tzinfo=<UTC>)

请注意,采用时区之前的日期会给你奇怪的偏移量。这是因为 IANA 决定使用当地平均时间

>>> chicago = pytz.timezone("America/Chicago")
>>> weird_time = chicago.localize(
...   datetime.datetime.strptime("November 18, 1883, 11:00:00",
...                              "%B %d, %Y, %H:%M:%S")
... )
>>> weird_time.astimezone(pytz.utc)
datetime.datetime(1883, 11, 18, 7, 34, tzinfo=<UTC>)

诡异的“7小时34分钟”来自芝加哥的经度。我之所以使用这个时间戳,是因为它正好在芝加哥采用标准化时间之前。

17赞 Ryu_hayabusa 11/21/2014 #7

Django 时区感知 datetime 对象示例。

import datetime
from django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

当你有以下条件时,这种转换对 Django 和 Python 非常重要:USE_TZ = True

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.
70赞 Rizwan Mumtaz 12/10/2014 #8

记住这一点,您就不需要再次在日期时间转换中感到困惑。

字符串到 datetime 对象 =strptime

datetime 对象转换为其他格式 =strftime

Jun 1 2005 1:33PM

等于

%b %d %Y %I:%M%p

%b 月份作为区域设置的缩写名称(Jun)

%d 月份中的某一天,作为零填充的十进制数 (1)

%Y 以世纪为十进制数的年份(2015)

%I 小时(12 小时制)作为零填充的十进制数 (01)

%M 分钟作为零填充的十进制数 (33)

%p 区域设置的等效项为 AM 或 PM(PM)

所以你需要 strptime i-e 转换为string

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

输出

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

如果你有不同的日期格式,你可以使用 panda 或 dateutil.parse

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

输出

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]
7赞 Raphael Amoedo 6/1/2015 #9

您可以使用easy_date来简化操作:

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
34赞 Alexander 12/20/2015 #10

以下是使用 Pandas 将格式化为字符串的日期转换为 datetime.date 对象的两种解决方案。

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

计时

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop

以下是转换 OP 的原始日期时间示例的方法:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]

有很多选项可以使用 从字符串转换为 Pandas 时间戳,因此如果您需要任何特殊的东西,请查看文档to_datetime

同样,时间戳具有许多属性和方法,除了.date

评论

0赞 FObersteiner 10/6/2021
我认为时间现在已经改变了(Python 3.9,pandas 1.3.3); 运行速度比我的机器快 3 倍左右。pd.DatetimeIndex(dates).date.tolist()[d.date() for d in pd.to_datetime(dates)]
19赞 guneysus 1/19/2016 #11
In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed
16赞 Mackraken 2/4/2016 #12

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

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

这已经足够通用了:

  • 如果您不传递任何参数,它将返回今天的日期。
  • 您可以覆盖默认的日期格式。
  • 您可以轻松地修改它以返回日期时间。
11赞 Bill Bell 3/1/2017 #13

箭头提供了许多有用的日期和时间功能。这段代码提供了问题的答案,并表明箭头还能够轻松设置日期格式并显示其他区域设置的信息。

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

有关详细信息,请参阅 http://arrow.readthedocs.io/en/latest/

2赞 smci 12/19/2017 #14

我的答案

在真实世界的数据中,这是一个真正的问题:多种、不匹配、不完整、不一致和多语言/地区的日期格式,通常在一个数据集中自由混合。生产代码失败是不行的,更不用说像狐狸一样异常快乐了。

我们需要尝试...捕获多个日期时间格式 fmt1,fmt2,...,fmtn 并抑制/处理所有不匹配的异常 (from)(特别是,避免需要 Try..catch 子句)。从我的解决方案strptime()

def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
    for fmt in fmts:
        try:
            return datetime.strptime(s, fmt)
        except:
            continue

    return None # or reraise the ValueError if no format matched, if you prefer
5赞 Javed 12/21/2017 #15

如果您只需要日期格式,则可以通过传递您的单个字段来手动转换它,例如:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

您可以传递拆分字符串值以将其转换为日期类型,如下所示:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

您将获得日期格式的结果值。

33赞 user1767754 1/2/2018 #16

我个人喜欢使用该模块的解决方案,这是这个问题的第二个答案,而且很漂亮,因为您不必构造任何字符串文字即可使其工作。但是,一个缺点是它比公认的答案慢 90%。parserstrptime

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.70296801342902
1.3627995655316933

只要你不是一遍又一遍地这样做一百万次,我仍然认为该方法更方便,并且会自动处理大部分时间格式。parser

16赞 Kanish Mathew 8/16/2018 #17

这将有助于将字符串转换为日期时间以及时区:

def convert_string_to_time(date_string, timezone):

    from datetime import datetime
    import pytz

    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)
2赞 Riz.Khan 1/1/2019 #18

用:

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

它显示“开始日期时间”列和“上次登录时间”都是数据框中的“对象 = 字符串”:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object

    Start Date           1000 non-null object

    Last Login Time      1000 non-null object

Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: float64(1), int64(1), object(6)
memory usage: 62.6+ KB

通过使用提及中的选项,您可以将字符串 datetime 转换为 pandas datetime 格式。parse_datesread_csv

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv", parse_dates=["Start Date", "Last Login Time"])
emp.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object

     Start Date           1000 non-null datetime64[ns]
     Last Login Time      1000 non-null datetime64[ns]

Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: datetime64[ns](2), float64(1), int64(1), object(4)
memory usage: 62.6+ KB
274赞 SuperNova 2/22/2019 #19

Python >= 3.7

若要将 YYYY-MM-DD 字符串转换为 datetime 对象,可以使用 datetime.fromisoformat

from datetime import datetime

date_string = "2012-12-12 10:10:10"
print (datetime.fromisoformat(date_string))
2012-12-12 10:10:10

文档中的注意事项:

不支持解析任意 ISO 8601 字符串 - 它仅用作 datetime.isoformat() 的反向操作。功能更全面的 ISO 8601 解析器,可在第三方软件包 dateutil 中找到。dateutil.parser.isoparse

评论

0赞 hm6 2/5/2022
有没有办法将这个答案包含在最高答案中?
1赞 Zincfan 3/8/2022
在我的情况下,这似乎返回了时区不知道的日期时间格式。所以减去会给你带来错误。看到这个,stackoverflow.com/questions/4530069/...fromisoformat()datetime.datetime.now()
0赞 Walter Tross 5/24/2022
这个答案对大多数登陆这里的人来说非常有用,即使它不适合原来的问题。
0赞 Flimm 7/19/2022
@Zincfan确实在正确的情况下返回具有时区偏移量的对象。请参阅 Python 的文档:docs.python.org/3/library/...fromisoformatdatetime
0赞 java-addict301 3/31/2023
简直不敢相信他们会添加如此误导性的方法。如果无法解析 iso,为什么要命名 iso?
10赞 Bilesh Ganguly 1/13/2020 #20

您还可以查看 dateparser

DateParser提供了一些模块,可以轻松地解析本地化的日期,几乎 网页上常见的任何字符串格式。

安装:

pip install dateparser

我认为,这是解析日期的最简单方法。

最直接的方法是使用函数, 它环绕了模块中的大部分功能。dateparser.parse

示例代码:

import dateparser

t1 = 'Jun 1 2005  1:33PM'
t2 = 'Aug 28 1999 12:00AM'

dt1 = dateparser.parse(t1)
dt2 = dateparser.parse(t2)

print(dt1)
print(dt2)

输出:

2005-06-01 13:33:00
1999-08-28 00:00:00
4赞 Grzegorz 9/29/2020 #21

似乎使用 pandas Timestamp 是最快的:

import pandas as pd

N = 1000

l = ['Jun 1 2005  1:33PM'] * N

list(pd.to_datetime(l, format=format))

%timeit _ = list(pd.to_datetime(l, format=format))
1.58 ms ± 21.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

其他解决方案

from datetime import datetime
%timeit _ = list(map(lambda x: datetime.strptime(x, format), l))
9.41 ms ± 95.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

from dateutil.parser import parse
%timeit _ = list(map(lambda x: parse(x), l))
73.8 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

如果字符串是 ISO 8601 字符串,请使用 csio8601

import ciso8601

l = ['2014-01-09'] * N

%timeit _ = list(map(lambda x: ciso8601.parse_datetime(x), l))
186 µs ± 4.13 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
39赞 jjm 10/5/2020 #22

如果您的字符串采用 ISO 8601 格式,并且您有 Python 3.7+,则可以使用以下简单代码:

import datetime

aDate = datetime.date.fromisoformat('2020-10-04')

对于日期和

import datetime

aDateTime = datetime.datetime.fromisoformat('2020-10-04 22:47:00')

对于包含日期和时间的字符串。如果包含时间戳,则该函数支持以下格式:datetime.datetime.isoformat()

YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]]

其中匹配任何单个字符。另请参阅此处和此处*

2赞 John Forbes 3/26/2021 #23

将 yyyy-mm-dd 日期字符串映射到 datetime.date 对象的简短示例:

from datetime import date
date_from_yyyy_mm_dd = lambda δ : date(*[int(_) for _ in δ.split('-')])
date_object = date_from_yyyy_mm_dd('2021-02-15')
3赞 officialrahulmandal 8/23/2021 #24

如果您不想显式指定字符串相对于日期时间格式的格式,则可以使用此 hack 来传递该步骤:

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

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

5赞 Grant Shannon 11/11/2021 #25

Javed 的答案类似,我只想从字符串中获取日期 - 因此结合 Simon 和 Javed 的逻辑,我们得到:

from dateutil import parser
import datetime

s = '2021-03-04'

parser.parse(s).date()

输出

datetime.date(2021, 3, 4)

0赞 Niyaz 10/18/2022 #26
#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'>
2赞 cottontail 5/31/2023 #27

您可以在 https://strftime.org/ 查看所有可能的日期时间格式。

如果要将多个字符串转换为 datetime 对象,则可以使用列表推导式或 map 。datetime.strptime

from datetime import datetime
from itertools import repeat
from dateutil import parser

dates = ["Jun 1 2005  1:33PM", "Jun 3 2005  1:33PM"]
# use list comprehension
parsed_dates = [datetime.strptime(d, '%b %d %Y  %I:%M%p') for d in dates]
# map the parser function
parsed_dates = list(map(datetime.strptime, dates, repeat('%b %d %Y %I:%M%p')))
# map parser.parse
parsed_dates = list(map(parser.parse, dates))

至少从 Python 3.10 开始,映射内置方法比列表推导更快。此外,值得一提的是,如果您需要解析许多日期时间字符串,那么它大约慢了 7 倍,这非常重要。datetime.strptimedateutil.parserdatetime.strptime

如果性能是一个问题,一个流行的第三方库提供了非常快速地解析日期时间字符串的函数。它比循环快 2 倍以上(即使您必须将 pandas 对象转换回 Python 列表)。它的一个好处是,在解析重复的日期字符串时,会缓存唯一转换的日期,因此速度显着提高。在下面的示例中,具有重复日期时间字符串的列表的分析速度比具有唯一日期时间字符串的列表快 4 倍(因此它比 快 8 倍)。pandasto_datetimedatetime.strptimedatetime.strptime

import pandas as pd
dates = pd.date_range('2000', '2020', 1000000).strftime('%b %d %Y %I:%M%p').tolist()

%timeit _ = pd.to_datetime(dates, format='%b %d %Y %I:%M%p').tolist()
# 4.73 s ± 41.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit _ = [datetime.strptime(d, '%b %d %Y %I:%M%p') for d in dates]
# 9.73 s ± 48.5 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit _ = list(map(datetime.strptime, dates, repeat('%b %d %Y %I:%M%p')))
# 9.63 s ± 23.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


# with duplicate dates, it's even faster
dates = pd.date_range('2000-1-1', '2000-1-2', 1000000).strftime('%b %d %Y %I:%M%p').tolist()

%timeit _ = pd.to_datetime(dates, format='%b %d %Y %I:%M%p').tolist()
# 1.16 s ± 8.11 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)