当字符串与特定日期格式不匹配时,将字符串转换为日期时间

时间:2020-08-05 20:23:29

标签: python datetime python-datetime

使用Python将以下字符串转换为日期时间对象时遇到麻烦。我有一个很大的csv文件(超过1万行),我需要从以下格式转换一列日期:

Jun 1, 2020 12:11:49 AM PDT

收件人:

06/01/20

我的第一个想法是使用datetime.strptime,它要求传入字符串及其所包含的日期格式,因为这样我就可以将一个日期类型重新格式化为另一个真正的简单类型。我遇到的问题是我不知道如何将字符串表示为日期格式,主要是由于时区的原因。

我对我需要的日期格式的最佳猜测是'%mmm%dd,%yyyy%H:%M:%S%aa',但我不知道如何在此处表示时区(也不确定AM / PM是%aa)。

我尝试查看其他线程,但是它们似乎都具有容易匹配的字符串。

谢谢!

3 个答案:

答案 0 :(得分:1)

下表中记录了格式,特别是AM / PM为%p,时区为%Z

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes

但是,对于您的情况,我建议您完全不要理会解析,而要依靠dateutil进行解析。它更灵活,因为它几乎总是可以找出正确的格式。

答案 1 :(得分:0)

我会完全切出时间和时区

那么您有很多选择。如前所述,dateutil很酷,而且效果很好。但是,如果您出于某种原因想要停留在约会时间,则可以:

  • 解析整个内容,但知道时区会被忽略

Datetime / strptime可以解析整个内容,但是并不能真正理解/转换时区。如果这样做,它将仅将其解析为UTC。

>>> str(datetime.strptime("Jun 1, 2020 12:11:49 AM PDT", "%b %d, %Y %I:%M:%S %p %Z"))
'2020-06-01 00:11:49'

您也可以在将时间部分交给strptime()之前丢弃它,但这可能比给定其他选项值得的麻烦得多。


糟糕。我没有意识到%Z仅会解析某些时区(这可能取决于您的计算机)。因此,如果您无法控制它,那将无法正常工作。在我的计算机上,“ PDT”将解析,而“ EDT”将失败。

鉴于此,我将放弃时区。如果始终采用这种格式,则可能类似于:

>>> ts = "Jun 1, 2020 12:11:49 AM PDT"
>>> str(datetime.strptime(ts.rpartition(" ")[0], "%b %d, %Y %I:%M:%S %p"))
'2020-06-01 00:11:49'

答案 2 :(得分:0)

正如@adrtam所建议的那样,您可以使用dateutil的解析器来方便地解析这样的字符串。要正确解析时区,您可以为其提供映射dict

from dateutil import parser, tz

s = 'Jun 1, 2020 12:11:49 AM PDT'

tzmapping = {'PDT': tz.gettz('US/Pacific')} # assuming PDT means Pacific daylight saving time

dt = parser.parse(s, tzinfos=tzmapping)

dt
Out[2]: datetime.datetime(2020, 6, 1, 0, 11, 49, tzinfo=tzfile('US/Pacific'))

现在您可以轻松地将其格式化为字符串:

s_reformatted = dt.strftime('%m/%d/%y')

s_reformatted
Out[4]: '06/01/20'