我在格式化日期和时间时遇到问题。 我有包含日期和时间的数据文件。 下面是代表部分数据的示例日期。
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
答案 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