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

在Pandas中提取子串并结合列数据计算交易月数新列的问题

嘿,我来帮你搞定这个交易月数计算的问题!先理清楚核心需求:从Duration字符串里提取时间信息,必要时结合Issues in 1 year列算出对应的交易月数。我先给你一套通用的解决框架,再针对常见的坑给出修正方案,你可以对照自己的代码调整~

核心思路拆解

第一步:解析Duration字符串里的时间信息

首先得把Duration里的数字和时间单位(月/年)提取出来,正则表达式是最靠谱的方式,能兼容大部分格式。比如处理"3 months"、"1 year"、"6 YEARS"这种写法:

import re
import pandas as pd

def extract_duration_details(duration_str):
    # 匹配数字+单位,兼容缩写(比如mo/yr)和大小写
    match = re.search(r'(\d+)\s*(month|mo|year|yr)s?', duration_str, re.IGNORECASE)
    if match:
        num = int(match.group(1))
        # 把缩写统一转换成标准单位
        unit_map = {'mo': 'month', 'yr': 'year'}
        unit = unit_map.get(match.group(2).lower(), match.group(2).lower())
        return num, unit
    # 解析失败时返回空值
    return None, None

# 把解析结果拆成两列临时存储
df[['duration_num', 'duration_unit']] = df['Duration'].apply(lambda x: pd.Series(extract_duration_details(x)))

第二步:结合Issues in 1 year计算交易月数

这里要明确你的业务逻辑:什么时候需要用Issues in 1 year?比如如果Duration是“1 year”,但Issues in 1 year是6,意味着每2个月交易一次,月数就是2。我写一个通用的计算函数,你可以根据实际需求调整:

def compute_trade_months(row):
    # 优先用Duration直接转换
    if row['duration_unit'] == 'month':
        return row['duration_num']
    elif row['duration_unit'] == 'year':
        # 有有效Issues数据时,用12除以年交易次数得到月数
        if pd.notna(row['Issues in 1 year']) and row['Issues in 1 year'] > 0:
            # 要整数就用//,要小数就用/
            return 12 // row['Issues in 1 year']
        else:
            # 没有Issues数据时,默认按每年12次交易(每月1次)
            return 1
    # Duration解析失败的情况, fallback到用Issues计算
    else:
        if pd.notna(row['Issues in 1 year']) and row['Issues in 1 year'] > 0:
            return 12 // row['Issues in 1 year']
        else:
            # 完全没有数据时返回空值,也可以设默认值比如1
            return None

# 生成最终的交易月数列
df['Trade_Months'] = df.apply(compute_trade_months, axis=1)
常见问题修正方案

如果你的现有代码遇到了问题,大概率是下面这些场景:

  • 问题1:Duration格式太乱(比如"3m"、"1Y")
    调整正则表达式里的匹配规则,把所有可能的缩写加进去,比如把正则改成r'(\d+)\s*(month|mo|m|year|yr|y)s?',同时更新unit_map对应上。
  • 问题2:Issues in 1 year有缺失值或0
    先给缺失值填充合理的默认值,比如:
    # 假设默认每年12次交易,填充缺失值
    df['Issues in 1 year'] = df['Issues in 1 year'].fillna(12)
    # 把0替换成12,避免除以0
    df['Issues in 1 year'] = df['Issues in 1 year'].replace(0, 12)
    
  • 问题3:计算出的月数不符合预期
    检查你的业务逻辑:比如如果Duration是“6 months”,是不是直接返回6?如果Issues in 1 year是4,是不是应该返回3(12/4)?根据实际需求修改compute_trade_months里的判断逻辑就行。

如果还有具体的报错或者某行数据计算不对,把你的现有代码和样例数据贴出来,我再帮你针对性调整!

内容的提问来源于stack exchange,提问作者G-Money

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:44:41