You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

处理结果:

detailsInstrumentYearmonthDatestrikeCEorPE
NIFTY2431322000PENIFTY2431322000PE
NIFTY2441522000PENIFTY2441522000PE

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'

处理结果:

detailsInstrumentYearmonthstrikeCEorPEdate
NIFTY24MAR22000PENIFTY24MAR22000PE30
NIFTY24DEC22000PENIFTY24DEC22000PE30

当前痛点

当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)

运行结果:

detailsInstrumentstrikeCEorPEexpiry_date
NIFTY2431322000PENIFTY22000PE2024-03-13
NIFTY24DEC22000PENIFTY22000PE2024-12-30

关键说明

  • 正则中的(?:(\d{1})(\d{2})|([A-Z]{3}))是非捕获组,用来匹配两种日期格式:数字月+数字日或英文月份缩写
  • 用fillna()填充缺失的月份和日期值,保证两种格式的数据都能生成有效的日期字段
  • pd.to_datetime()自动识别数字月份和英文月份,统一转成datetime格式,方便后续处理

内容的提问来源于stack exchange,提问作者Amingo husk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:43:17