如何在DataFrame中提取多格式列值并拆分到期日期至单列
拆分DataFrame中混合格式的期权详情字段
我编程经验不足,现在卡在拆分DataFrame的details列数据上——需要提取Instrument、到期日期(expiry date)、strike、期权类型(opt type),尤其是到期日期的拆分环节,没法同时处理两种格式的混合数据。
现有两种格式的样本及处理代码
Sample 1:数字格式到期日
data = ["NIFTY2431322000PE", "NIFTY2441522000PE"] df = pd.DataFrame({'details': data}) # 匹配数字格式的正则 pattern = r'([A-Z]+)(\d{2})(\d{1})(\d{2})(\d{5})([A-Z]+)' df[['Instrument', 'Year', 'month', 'Date', 'strike', 'CEorPE']] = df['details'].str.extract(pattern)
处理结果:
| details | Instrument | Year | month | Date | strike | CEorPE |
|---|---|---|---|---|---|---|
| NIFTY2431322000PE | NIFTY | 24 | 3 | 13 | 22000 | PE |
| NIFTY2441522000PE | NIFTY | 24 | 4 | 15 | 22000 | PE |
Sample 2:英文月份格式到期日
data = ["NIFTY24MAR22000PE", "NIFTY24DEC22000PE"] df = pd.DataFrame({'details': data}) # 匹配英文月份的正则 pattern = r'([A-Z]+)(\d{2})([A-Z]+)(\d{5})([A-Z]+)' df[['Instrument', 'Year','month', 'strike', 'CEorPE']] = df['details'].str.extract(pattern) df['date'] = '30'
处理结果:
| details | Instrument | Year | month | strike | CEorPE | date |
|---|---|---|---|---|---|---|
| NIFTY24MAR22000PE | NIFTY | 24 | MAR | 22000 | PE | 30 |
| NIFTY24DEC22000PE | NIFTY | 24 | DEC | 22000 | PE | 30 |
当前痛点
当DataFrame同时包含两种格式的数据时(比如data = ["NIFTY2431322000PE", "NIFTY24DEC22000PE"]),现有代码无法兼容处理,希望能把到期日期合并成单独的统一格式列。
解决方案:兼容两种格式的正则+日期合并
用一个能同时匹配两种格式的正则表达式提取字段,再通过填充缺失值合并日期信息,最后转成统一的日期格式:
import pandas as pd # 混合格式的测试数据 data = ["NIFTY2431322000PE", "NIFTY24DEC22000PE"] df = pd.DataFrame({'details': data}) # 兼容两种格式的正则:匹配数字月日/英文月份两种情况 pattern = r'([A-Z]+)(\d{2})(?:(\d{1})(\d{2})|([A-Z]{3}))(\d{5})([A-Z]+)' extracted = df['details'].str.extract(pattern) # 给提取的列命名 extracted.columns = ['Instrument', 'Year', 'Month_num', 'Day', 'Month_str', 'strike', 'CEorPE'] # 合并字段,处理缺失值 df['Instrument'] = extracted['Instrument'] df['strike'] = extracted['strike'] df['CEorPE'] = extracted['CEorPE'] # 补全年份(假设是20xx年) df['full_year'] = '20' + extracted['Year'] # 合并月份:数字月份优先,没有则用英文缩写 df['month'] = extracted['Month_num'].fillna(extracted['Month_str']) # 合并日期:数字日期优先,没有则用默认30号 df['day'] = extracted['Day'].fillna('30') # 生成统一格式的到期日期列 df['expiry_date'] = pd.to_datetime(df['full_year'] + '-' + df['month'] + '-' + df['day'], errors='coerce') # 清理临时列,保留需要的字段 df = df[['details', 'Instrument', 'strike', 'CEorPE', 'expiry_date']] print(df)
运行结果:
| details | Instrument | strike | CEorPE | expiry_date |
|---|---|---|---|---|
| NIFTY2431322000PE | NIFTY | 22000 | PE | 2024-03-13 |
| NIFTY24DEC22000PE | NIFTY | 22000 | PE | 2024-12-30 |
关键说明
- 正则中的
(?:(\d{1})(\d{2})|([A-Z]{3}))是非捕获组,用来匹配两种日期格式:数字月+数字日或英文月份缩写 - 用
fillna()填充缺失的月份和日期值,保证两种格式的数据都能生成有效的日期字段 pd.to_datetime()自动识别数字月份和英文月份,统一转成datetime格式,方便后续处理
内容的提问来源于stack exchange,提问作者Amingo husk
相关产品推荐
相关产品推荐

