[英]How to change string date range to start and end date?
我正在尝试将字符串日期范围(例如7月1日至30日)分隔为开始日期和结束日期作为日期时间(例如07/1/2019和07/30/2019)。 如何转换?
我曾尝试将字符串制动成碎片,但我相信使用正则表达式的唯一方法。
列中的字符串示例:
"1 to 30 of July" "10 to 12 of August" "20 of January to 10 of February"
我用过^(\\d{1,2})\\s([az]{2})\\s(\\d{1,2})\\s([az]{2})\\s(\\w{1,13})
但我缺少M的D到M的D。
他们都在2019年
我们可以将regex与Series.str.extractall
一起使用,以从您的数据中提取数字和月份。 然后,我们最终将字符串连接在一起:
days = df['Date'].str.extractall('(\d+)').unstack()
months = '('+'|'.join(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'])+')'
monthnames = df['Date'].str.extractall(months).unstack().ffill(axis=1)
df = days + ' ' + monthnames.ffill(axis=1)
df.columns=['date_start', 'date_end']
产量
date_start date_end
0 1 July 30 July
1 10 August 12 August
2 20 January 10 February
如果您希望它们采用不带月份名称的日期格式:
df.apply(lambda x: pd.to_datetime(x, format='%d %B').dt.strftime('%m-%d'))
date_start date_end
0 07-01 07-30
1 08-10 08-12
2 01-20 02-10
下面将提取日期和月份:
# update your month list properly
months = ['January', 'February', 'July', 'August']
# pattern
pattern = f'(\d+) (?:of ({m}))?\s?to (\d+).*({m})'
# extract:
s.str.extract(patterns)
输出:
0 1 2 3
0 1 NaN 30 July
1 10 NaN 12 August
2 20 January 10 February
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.