将 String 转换为不同格式的 Datetime 对象 python

Convert String to Datetime objects with different formats python

所以,我正在使用一个数据框,其中日期以不同格式存储为字符串(人们为什么这样做??),我需要将它们转换为日期时间对象。问题是它们不仅具有不同的格式,而且还使用不同的语言。我认为解决此问题的唯一方法是使用匹配每种特定格式的 Regex,然后将其作为参数传递给 pd.to_datetime 函数,但我无法使正则表达式匹配任何字符串。我认为 Regex 不适用于日期时间对象,例如 %d, %b, %Y, etc。 (我一次尝试使用一个实例,但它无法识别它们)。

如果我 运行 pd.to_datetime 方法,它会显示一个错误,因为这些实例是西班牙语或其他语言(编号 7 和 9)。所以我想创建一个正则表达式,但我无法让它工作。我该如何解决这个问题?

我给出了一个非常简化的 DF 示例,其中包含不同类型的日期格式,因为有超过 80 万个实例。

    a={'date/time': {0: 'Jan 1, 2020 5:27:21 PM PST',
  1: 'Apr. 26, 2020 12:25:56 p.m. PDT',
  2: 'May 6, 2020 6:25:16 a.m. PDT',
  3: '11/01/2019 18:33:39 PST',
  4: 'May 15, 2020 2:25:12 a.m. PDT',
  5: '30/01/2019 18:35:23 PST',
  6: '10 feb. 2020 21:23:39 GMT-8',
  7: '28 abr. 2020 21:04:03 GMT-7',
  8: 'Jan 2, 2020 2:01:54 AM PST',
  9: '25 ago. 2020 16:07:35 GMT-7'},
 'settlement id': {0: 12493053321,
  1: 12493053321,
  2: 12493053321,
  3: 12493053321,
  4: 12493053321,
  5: 12493053321,
  6: 12493053321,
  7: 12493053321,
  8: 12493053321,
  9: 12493053321}}

import pandas as pd

b=pd.DataFrame(a)
b["fecha2"]=pd.to_datetime(b["date/time"])

非常感谢!!!

您可以尝试像 dateparser 这样的通用日期解析库,它支持在 200 多种语言环境中解析日期,并以与语言无关的方式解析多种格式。

将“date/time”列重命名为“日期时间”列。

import dateparser
b["fecha2"] = b.datetime.apply(lambda x: dateparser.parse(x))

这是您输入的输出:

如果工作量不大,可以做一个字符串替换字典。例如:

MONTH_DICT = {
    'abr': 'apr', 
    'ago': 'aug',
}

date = df["date/time"].replace(MONTH_DICT, regex=True)
date = pd.to_datetime(date, errors="raise")
df["date"] = date

输出:

                         date/time  settlement id                       date
0       Jan 1, 2020 5:27:21 PM PST    12493053321  2020-01-01 17:27:21-08:00
1  Apr. 26, 2020 12:25:56 p.m. PDT    12493053321  2020-04-26 12:25:56-07:00
2     May 6, 2020 6:25:16 a.m. PDT    12493053321  2020-05-06 06:25:16-07:00
3          11/01/2019 18:33:39 PST    12493053321  2019-11-01 18:33:39-07:00
4    May 15, 2020 2:25:12 a.m. PDT    12493053321  2020-05-15 02:25:12-07:00
5          30/01/2019 18:35:23 PST    12493053321  2019-01-30 18:35:23-08:00
6      10 feb. 2020 21:23:39 GMT-8    12493053321  2020-02-10 21:23:39+08:00
7      28 abr. 2020 21:04:03 GMT-7    12493053321  2020-04-28 21:04:03+07:00
8       Jan 2, 2020 2:01:54 AM PST    12493053321  2020-01-02 02:01:54-08:00
9      25 ago. 2020 16:07:35 GMT-7    12493053321  2020-08-25 16:07:35+07:00

如果无法解析日期(而不是静默转换失败),这将引发错误。请注意,此简单版本将替换找到的 MONTH_DICT 键中的任何子字符串。


我使用了解析和所有类型的日期格式,return 可读的年、月、日、小时、分钟。

然后我将它们转换为具有特定格式 '%Y-%m-%d::%H-%M'

的字符串时间
from dateutil.parser import parse
from datetime import datetime
dt1=parse('30/01/2019 18:35:23 PST')
dt1
datetime.datetime(2019, 1, 30, 18, 35, 23)
dt2=parse('Jan 1, 2020 5:27:21 PM PST')
dt2
datetime.datetime(2020, 1, 1, 17, 27, 21)
dt3=parse('10 feb. 2020 21:23:39 GMT-8')
dt3
datetime.datetime(2020, 2, 10, 21, 23, 39, tzinfo=tzoffset(None, 28800))
parse('May 15, 2020 2:25:12 a.m. PDT')
C:\ProgramData\Anaconda3\lib\site-packages\dateutil\parser\_parser.py:1206: UnknownTimezoneWarning: tzname PDT identified but not understood.  Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.  In a future version, this will raise an exception.
  category=UnknownTimezoneWarning)
datetime.datetime(2020, 5, 15, 2, 25, 12)
dt11 = datetime(2020, 5, 15, 2, 25, 12)

print(dt11.strftime('%Y-%m-%d::%H-%M'))

2020-05-15::02-25

dt22=print(dt2.strftime('%Y-%m-%d::%H-%M'))

2020-01-01::17-27