如何用Python切片或split方法拆分Pandas DataFrame中的特定格式字符串?
用正则表达式拆分期权合约字符串为指定字段
固定切片的局限性很明显——证券名称长度不固定(比如BANKNIFTY是9位,TCS只有3位),日期格式还分数字编码和月份缩写两种,完全没法用固定位置来切。最靠谱的方式是用正则表达式匹配字符串的模式,直接提取四个部分。
这里针对你的合约字符串格式,写一个精准匹配的正则,结合Pandas的str.extract方法就能一次性拆分出所有字段:
import pandas as pd # 示例数据 data = {'symbol': ['BANKNIFTY2330935500PE', 'FINNIFTY2330618050PE', 'NIFTY23DEC21000CE', 'TCS23MAR3000PE']} df = pd.DataFrame(data) # 正则提取四个字段 df[['security', 'date', 'value', 'type']] = df['symbol'].str.extract(r'^([A-Z]+)(\d{5}|[0-9]{2}[A-Z]{3})(\d+)([A-Z]{2})$') print(df)
运行后会得到拆分结果:
| symbol | security | date | value | type |
|---|---|---|---|---|
| BANKNIFTY2330935500PE | BANKNIFTY | 23309 | 35500 | PE |
| FINNIFTY2330618050PE | FINNIFTY | 23306 | 18050 | PE |
| NIFTY23DEC21000CE | NIFTY | 23DEC | 21000 | CE |
| TCS23MAR3000PE | TCS | 23MAR | 3000 | PE |
正则表达式说明
^([A-Z]+):匹配字符串开头的所有大写字母,对应证券名称部分(\d{5}|[0-9]{2}[A-Z]{3}):匹配两种日期格式——5位数字编码(如23309)或「两位年份+三位月份缩写」(如23DEC)(\d+):匹配日期之后的连续数字,对应行权价数值([A-Z]{2})$:匹配字符串结尾的两位大写字母,对应合约类型(PE/CE)
这种方法完全不依赖固定位置,能适配所有你列出的合约格式,后续如果有同模式的新合约也能直接兼容。
内容的提问来源于stack exchange,提问作者Thomas Amal
相关产品推荐
相关产品推荐

