日期和时间列具有混合格式

时间:2019-04-30 13:04:53

标签: python pandas datetime

我在格式化日期和时间时遇到问题。 我有包含日期​​和时间的数据文件。 下面是代表部分数据的示例日期。

data = pd.DataFrame()
data['Date'] = ['01 Jul 2014 - Qualification','30 Sep 2014 - Group Stage','17 Mar 2015 - Play Offs',' 19:00:00']
data ['ID'] = [1,2,3,4]

我创建了一个新列,并尝试使用 datetime 进行格式化,如下所示:

data['date1'] = pd.to_datetime(data.Date,errors = 'coerce')

我在日期时间内得到了所有NaT。 我还想创建两个新列,例如“时间”列和“舞台”来代表时间和游戏阶段。

我可以知道如何解决该问题吗?

谢谢

Zep

2 个答案:

答案 0 :(得分:1)

Date列中的文本不只是日期/时间。您不能将其原样转换为datetime对象。您需要将文本的日期/时间部分与其余部分分开。为此,您可以拆分-并展开以在临时数据帧df_temp的单独列中获取舞台文本和日期,然后使用这些列在现有数据帧中分配和创建每个文本和日期:< / p>

In [27]: df_temp = data['Date'].str.split('-', expand=True)

In [28]: data['date1'] = df_temp[0]

In [29]: data['stage'] = df_temp[1]

In [30]: data
Out[30]:
                          Date  ID         date1           stage
0  01 Jul 2014 - Qualification   1  01 Jul 2014    Qualification
1    30 Sep 2014 - Group Stage   2  30 Sep 2014      Group Stage
2      17 Mar 2015 - Play Offs   3  17 Mar 2015        Play Offs
3                     19:00:00   4      19:00:00            None

In [31]: data['date1'] = pd.to_datetime(data.date1,errors = 'coerce')

In [32]: data
Out[32]:
                          Date  ID      date1           stage
0  01 Jul 2014 - Qualification   1 2014-07-01   Qualification
1    30 Sep 2014 - Group Stage   2 2014-09-30     Group Stage
2      17 Mar 2015 - Play Offs   3 2015-03-17       Play Offs
3                     19:00:00   4        NaT            None

答案 1 :(得分:1)

您可以在Series.str.extract处使用正则表达式:

#https://stackoverflow.com/a/47656743
pat = r'(\d+/\d+(?:/\d+)?|(?:\d+ )?(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|June?|July?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)[.,]?(?:-\d+-\d+| \d+(?:th|rd|st|nd)?,? \d+| \d+)|\d{4})'

#https://stackoverflow.com/a/46069885
pat = r'((?:\d{,2}\s)?(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*(?:-|\.|\s|,)\s?\d{,2}[a-z]*(?:-|,|\s)?\s?\d{2,4})'

s = data['Date'].str.extract(pat, expand=False)
data['date1']  = pd.to_datetime(s, errors = 'coerce')
print (data)
                          Date  ID      date1
0  01 Jul 2014 - Qualification   1 2014-07-01
1    30 Sep 2014 - Group Stage   2 2014-09-30
2      17 Mar 2015 - Play Offs   3 2015-03-17
3                     19:00:00   4        NaT