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
对象,使用.date()
进行转换:>>> datetime.strptime('Jun 1 2005', '%b %d %Y').date()
date(2005, 6, 1)
链接:
strftime.org格式字符串速查表
注释:
strptime
= "解析字符串时间"strftime
= "格式化字符串时间"date
而不是一个 datetime
,可以通过使用 datetime
很好地处理它:datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
。你需要提前知道排除格式字符串的那一部分。 - Izkatadatetime
对象:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
。 - Flimm使用第三方dateutil
库:
from dateutil import parser
parser.parse("Aug 28 1999 12:00AM") # datetime.datetime(1999, 8, 28, 0, 0)
它可以处理大多数日期格式,比strptime
更方便,因为它通常会猜对正确的格式。对于编写测试非常有用,因为可读性比性能更重要。
通过以下方式安装:
pip install python-dateutil
2009年6月
而不是2009年6月12日
,它将假定任意日期。对于没有月份的日期也是如此。 - theProcrastinator请查看time模块中的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)
要将YYYY-MM-DD字符串转换为日期时间对象,可以使用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
。
fromisoformat()
在我的情况下似乎返回了一个没有时区信息的日期时间格式。因此,从 datetime.datetime.now()
中减去它会导致错误。请参考这个链接:https://dev59.com/fm855IYBdhLWcg3wHwaH#4530166 - Zincfanfromisoformat
在正确的情况下确实返回带有时区偏移量的datetime
对象。请参阅Python文档:https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat - Flimm我已经完成了一个项目,可以将一些非常棒的表达式转换成时间。请查看timestring。
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))
记住这个,你就不会再在日期时间转换中感到困惑了。
字符串转日期时间对象 = strptime
日期时间对象转其他格式 = strftime
Jun 1 2005 1:33PM
等同于
%b %d %Y %I:%M%p
%b 本地缩写月份名称(Jun)
%d 月份中的第几天,以零填充的十进制数(1)
%Y 带有世纪的年份,以十进制数表示(2015)
%I 小时(12小时制)以零填充的十进制数(01)
%M 分钟,以零填充的十进制数(33)
%p 上午或下午的本地化等效项(PM)
所以你需要使用strptime函数,即将字符串
转换为
>>> 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
如果你有不同格式的日期,你可以使用Pandas或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)]
>>> datetime.datetime.strptime(
... "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))
pytz
包查询IANA时区数据库的偏移量。我将在此处以德黑兰为例,因为它有半小时的偏移量:>>> 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>)
正如您所看到的,pytz
确定在那个特定日期的偏移量为+3:30。现在您可以将其转换为UTC时间,并应用该偏移量:
>>> utc_time = local_time.astimezone(pytz.utc)
>>> utc_time
datetime.datetime(2014, 3, 5, 16, 43, 50, tzinfo=<UTC>)
>>> 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>)
如果你的字符串采用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]]]]
以下是使用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)]
使用to_datetime
可以有多种将字符串转换为Pandas时间戳的选项,如果您需要任何特殊要求,请查看文档。
同样,除了.date
之外,时间戳还有许多属性和方法可供访问。
pd.DatetimeIndex(dates).date.tolist()
的运行速度大约比 [d.date() for d in pd.to_datetime(dates)]
快3倍。 - FObersteiner我个人喜欢使用parser
模块的解决方案,它是这个问题的第二个答案,而且非常精美,因为你不必构造任何字符串字面量来使其工作。 但是,缺点是它比使用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.70296801342902
1.3627995655316933
只要你不是一遍又一遍地执行这个操作 一百万 次,我仍然认为使用 parser
方法更加方便,并且会自动处理大多数时间格式。
strptime()
的异常处理将让您抓狂,除非您将其包装起来。请参考我的回答,基于Or Weis 对此的回答。 - smcidatetime.strptime
是一个很有用的函数。如果您喜欢视频讲解,可以在这里观看。 - Ben