Python pandas str.extract带有附加逻辑(lambda?)
我在文本中有许多类型的日期:Python pandas str.extract带有附加逻辑(lambda?),python,pandas,Python,Pandas,我在文本中有许多类型的日期: 2009年4月20日 04/20/09 2009年4月20日 4/3/09 04-20-2009 还有更多 我正在使用一个正则表达式(或几个正则表达式)来提取日期 Lucky pandas有一个非常有用的函数,名为extract,例如,它可以很好地提取我的大部分日期: df['text'].str.extract(r'(\d{1,2})[\/-](\d{1,2})[\/-](\d{1,4})', expand=True) 如上所示,我有3个捕获组。这将创建3列
- 2009年4月20日李>
- 04/20/09李>
- 2009年4月20日李>
- 4/3/09
- 04-20-2009李>
df['text'].str.extract(r'(\d{1,2})[\/-](\d{1,2})[\/-](\d{1,4})', expand=True)
如上所示,我有3个捕获组。这将创建3列:月、日、年
是否有可能在它们上运行lambda并创建一个列
与在“替换”中使用lambdas的方式相同
pandas.DatFrame.str.extract()的输出是一个数据帧。如果需要,您可以对其使用pandas.DataFrame.apply()
,例如:
代码:
测试代码:
结果:
通过调整正则表达式以使用一个捕获组,可以避免单独列的问题。类似的内容适用于您提供的日期格式:
df.date.str.extract(r'([0-9]{1,2}[\/\.\-][0-9]{1,2}[\/\.\-][0-9]{1,4})', expand=False)
您可以进一步将结果转换为日期时间:
df['my_date_col'] = pd.to_datetime(df['my_date_col'])
为了证明<代码>pd.To_datetime
宽大:
import pandas as pd
lst = ['04/03/2009', '04/03/09', '4/03/09', '4/3/09', '04-03-2009',
'4-3-09', '3 Apr 2009', '3rd April 2009', '3-Apr-09', '3-Apr-2009',
'04/3/09', '04-3-09', '04-3-2009', '4-03-2009']
set(map(pd.to_datetime, lst))
# {Timestamp('2009-04-03 00:00:00')}
有一些库可以为您进行日期解析。不过,在合并它们之前,您可能需要做一些事情来处理年份。例如,如果你想让所有年份都是四位数。@Stephernauch谢谢,这只是一个例子,问题是在捕获组Does
pd上运行lambdas是否可能。to_datetime
这里不是为你做大部分工作吗?我支持@JonClements,至少有了上面的数据,熊猫日期时间能够以正确的格式转换所有日期。
text
0 04/20/2009;
1 04/20/09;
2 4/20/09;
3 4/3/09
4 04-20-2009;
0 04/20/2009
1 04/20/09
2 4/20/09
3 4/3/09
4 04/20/2009
dtype: object
df.date.str.extract(r'([0-9]{1,2}[\/\.\-][0-9]{1,2}[\/\.\-][0-9]{1,4})', expand=False)
df['my_date_col'] = pd.to_datetime(df['my_date_col'])
import pandas as pd
lst = ['04/03/2009', '04/03/09', '4/03/09', '4/3/09', '04-03-2009',
'4-3-09', '3 Apr 2009', '3rd April 2009', '3-Apr-09', '3-Apr-2009',
'04/3/09', '04-3-09', '04-3-2009', '4-03-2009']
set(map(pd.to_datetime, lst))
# {Timestamp('2009-04-03 00:00:00')}