我有一个字符串,我在那里提取看起来像
的日期部分A620170101 # output 20170101
在熊猫中我会做类似的事情,
df['var'] = df.sba.str.extract(r'A6(.{8})', expand=False)
但是,现在我需要更新以从一个看起来像
的字符串中提取日期JT20170101 # output 20170101
我尝试添加|
,但这不起作用。
这是一个快速测试数据,
d = {'var1': 'A620170101', 'var2': 'JT20170102', 'var3': '', 'var4': 'TG20170102'}
pd.DataFrame(list(d.items()), columns=['var', 'sba'])
我只想要带有A6和JT前缀的日期部分。
答案 0 :(得分:2)
使用comment的解决方案:
df['var3'] = df.sba.str.extract(r'(?:JT|A6)(.{8})', expand=False)
print (df)
var sba var3
0 var1 A620170101 20170101
1 var2 JT20170102 20170102
2 var3 NaN
3 var4 TG20170102 NaN
另一个解决方案是检查前2个值,如果在列表中提取2
到10
值:
df['var3'] = np.where(df.sba.str[:2].isin(['A6','JT']), df.sba.str[2:10], np.nan)
print (df)
var sba var3
0 var1 A620170101 20170101
1 var2 JT20170102 20170102
2 var3 NaN
3 var4 TG20170102 NaN
答案 1 :(得分:0)
如果你想使用“|”运营商,您可以尝试类似:
(?:JT|A6)(.{8})
之前的答案也很好。
答案 2 :(得分:0)
如果您的数据长度始终相同,如上所示,您可以跳过使用正则表达式,只需获取代码的前两个字符,然后抓取日期的最后8个字符。
如果你想要一个捕获任何前缀代码(任何长度)和日期后缀的正则表达式,你可以使用它:
(.*)(\d{8})
我不熟悉熊猫,但我认为它适用于此。