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

问:

如何将以下字符串转换为日期时间对象?

"Jun 1 2005  1:33PM"

答1:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

datetime.strptime 是将字符串解析为日期时间的主要例程。它可以处理各种格式,格式由您给它的格式字符串确定:

from datetime import datetime

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

生成的 datetime 对象是时区朴素的。

链接:

strptime 的 Python 文档:Python 2、Python 3

strptime/strftime 格式字符串的 Python 文档:Python 2、Python 3

strftime.org 也是 strftime 的一个非常好的参考

笔记:

strptime = “字符串解析时间”

strftime = “字符串格式化时间”

今天大声朗读它,您将不必在 6 个月内再次搜索它。

此外,正如@Izkata 发表的评论中所见,如果您想要一个日期而不是日期时间,那么通过 datetime 可以很好地处理它:

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

'%b'、'%p' 在非英语语言环境中可能会失败。

什么是字符串没有时间,只是“April 25, 2014”

@User 你必须提前知道排除格式字符串的那部分,但如果你想要一个 date 而不是 datetime,通过 datetime 可以很好地处理它:datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)

如果您知道字符串表示 UTC 中的日期时间,则可以通过在 Python 3 中添加以下行来获取时区感知 datetime 对象:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)

在我的情况下,“stackoverflow.com/a/54830426/6784445”答案是一个更好的匹配,我希望我们可以将它作为补充包含在这个解决方案中。

答2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

使用第三方 dateutil 库:

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

它可以处理大多数日期格式,包括您需要解析的日期格式。它比 strptime 更方便,因为它大部分时间都能猜出正确的格式。

它对于编写测试非常有用,因为可读性比性能更重要。

您可以使用以下方式安装它:

pip install python-dateutil

请注意,对于大量数据,这可能不是解决问题的最佳方法。每次都猜测格式可能非常慢。

这很好,但最好有一个内置的解决方案,而不是去第三方。

这对于您无法保证日期格式的情况非常有用。

如果您有不确定的格式并且其中一些格式不完整,例如 June 2009 而不是 12 June 2009,则它会假定任意一天。没有月份的日期也是如此。

答3:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

查看 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)

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

据我了解,这个答案只输出时间对象,而不是日期时间对象——这就是为什么与帕特里克的答案相比,这个答案会被埋没。

答4:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

蟒蛇> = 3.7

要将 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() 的逆操作。第三方包 dateutil 中提供了功能更全的 ISO 8601 解析器 dateutil.parser.isoparse。

正是我想要的。谢谢!

这很棒,完全适合我的用例。

有没有办法将此答案包含在最佳答案中?

在我的情况下,这个 fromisoformat() 似乎返回时区不知道日期时间格式。所以从 datetime.datetime.now() 中减去会给你错误。看到这个,stackoverflow.com/questions/4530069/…

这个答案对大多数登陆这里的人来说非常有用,即使它不适合最初的问题。

答5:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

我已经整理了一个可以转换一些非常简洁的表达式的项目。查看 timestring。

以下是一些示例:

点安装时间字符串

>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')

>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')

>>> (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))

答6:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

日期时间对象的字符串 = 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 区域设置等效于 AM 或 PM(PM)

所以你需要 strptime 即将 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
... 

输出


2005-06-01 13:33:00

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:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

许多时间戳都有隐含的时区。为确保您的代码在每个时区都能正常工作,您应该在内部使用 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)))

这假设您知道偏移量。如果您不知道,但您知道例如位置,您可以使用 pytz 包查询 IANA time zone database 的偏移量。我将在这里以德黑兰为例,因为它有半小时的偏移量:

>>> 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=)

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

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

请注意,采用时区之前的日期会给您带来奇怪的偏移量。这是因为 IANA 已决定使用 Local Mean Time:

>>> 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=)

奇怪的“7 小时 34 分钟”来源于芝加哥的经度。我使用了这个时间戳,因为它正好在 standardized time was adopted in Chicago 之前。

答8:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

如果你的字符串是 ISO8601 格式并且你有 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]]]]

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

答9:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

以下是使用 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 时间戳的选项有很多,因此如果您需要任何特殊内容,请检查 docs。

同样,除了 .date 之外,时间戳还有许多 properties and methods 可以访问

我认为现在时间已经改变(Python 3.9,pandas 1.3.3);在我的机器上,pd.DatetimeIndex(dates).date.tolist() 的运行速度比 [d.date() for d in pd.to_datetime(dates)] 快大约 3 倍。

答10:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

我个人喜欢使用 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 方法更方便,并且会自动处理大部分时间格式。

答11:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

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

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"))​​​​​​​

原文链接:https://www.huntsbot.com/qa/g1ZZ/converting-string-into-datetime?lang=zh_CN&from=csdn

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

物联沃分享整理
物联沃-IOTWORD物联网 » 如何将字符串转换为日期时间

发表评论