我正在使用pandas数据框,并希望从描述中的日期创建到系列,开始日期和结束日期。我正在使用正则表达式来查找日期的出现但似乎无法找到如何在第一个日期停止然后继续查找第二个日期。
在此处查看:How to stop at first occurence of match?
得出答案
(?s)(\d{1,2}/\d{1,2}/\d{2,4}).*
但这对我没有用,我仍然捕捉所有日期而不是第一次。
使用
(\d{1,2}/\d{1,2}/\d{2,4})?
也没有工作。
基本上我正试图进入
pattern_generic=re.compile('(\d{1,2}\/\d{1,2}\/\d{2,4})') #perhaps will do start and end)
report['Start Date'] = report['Description'].apply(lambda x: re.findall(pattern_start,x))
report['End Date'] = report['Description'].apply(lambda x: re.findall(pattern_end,x))
不确定这是否是找到第一个和第二个日期并将它们放入列中的最佳方法。任何帮助/建议表示赞赏!
编辑:
示例澄清:我有一个数据框,其中一列标题为'描述'提供各种项目,例如从1/2 / 13-3 / 4/15'购买订阅。我想将两个日期分为两列:开始和结束
Description Start Date End Date
'Purchased Subscription from 1/2/13-3/4/15' 1/2/13 3/4/15
答案 0 :(得分:2)
我会用这个:
(?s)\b(\d{1,2}/\d{1,2}/\d{2,4})\b-\b(\d{1,2}/\d{1,2}/\d{2,4})\b
开始日期将在第1组中,结束日期在第2组中。
答案 1 :(得分:0)
您可以使用以下正则表达式
(?s)(\d{1,2}/\d{1,2}/\d{2,4})-(\d{1,2}/\d{1,2}/\d{2,4}).*
将组索引1中的字符分配给Start Date
,将索引2分组为End Date
>>> s = """'Purchased Subscription from 1/2/13-3/4/15' 1/2/13 3/4/15
foo 1/2/13-3/4/15' 5/2/13 6/4/15
1/2/13-3/4/15' 7/2/13 8/4/15
1/2/13-3/4/15' 9/2/13 10/4/15"""
>>> m = re.search(r'(?s)(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s)
>>> m.group(1)
'1/2/13'
>>> m.group(2)
'3/4/15'
>>> m = re.findall(r'(\d{1,2}\/\d{1,2}\/\d{2,4})-(\d{1,2}\/\d{1,2}\/\d{2,4}).*', s, re.DOTALL)
>>> m
[('1/2/13', '3/4/15')]
答案 2 :(得分:0)
.*'\s+(\d+\/\d+\/\d+)\s+(\d+\/\d+\/\d+)
试试这个。开始日期将在group1中的group1和结束日期。
参见演示:
答案 3 :(得分:0)
以下是我用来完全解决问题的代码:
data['End Date'] = ''
data['Start Date']=''
pattern=re.compile('(?s)(\d{1,2}\/\d{1,2}\/\d{2,4}).*?(\d{1,2}\/\d{1,2}\/\d{2,4}).*')
first_list = []
second_list = []
for x in data['Product Description']:
m = re.search(pattern,x)
if m is None:
first_list.append('')
second_list.append('')
else:
first_list.append(m.group(1))
second_list.append(m.group(2))
data['Start Date'] = Series(first_list)
data['End Date'] = Series(second_list)