Pandas中如何将<X * Days>格式数据提取为整数?
解决思路与实现方法
你的报错原因很明确:dt 访问器只能用于datetime/timedelta类型的标量元素,但你的列里每个单元格是列表对象,所以直接调用.dt.days完全不适用。以下是针对这类列表数据的处理方案:
方法一:正则表达式提取数字(通用字符串场景)
如果列表中的元素是类似 <36 * Days> 的字符串格式,用正则提取数字是最稳妥的方式:
import re import pandas as pd # 定义处理单个列表的函数 def extract_day_numbers(td_list): # 遍历列表每个元素,提取其中的数字并转整数 return [int(re.search(r"\d+", str(item)).group()) for item in td_list] # 应用到目标列 df["tdColumn"] = df["tdColumn"].apply(extract_day_numbers)
处理后,列中每个列表会变成 [36, 23] 这样的整数列表,后续计算均值可以直接用:
# 新增均值列,空列表返回None避免报错 df["mean_days"] = df["tdColumn"].apply(lambda x: sum(x)/len(x) if x else None)
方法二:转换为Timedelta对象提取天数(针对timedelta字符串表示)
如果列表中的元素本质是pandas.Timedelta对象的字符串打印形式(比如直接输出就是<36 * Days>),可以先转换为Timedelta再取天数:
from pandas import Timedelta def extract_days_from_timedelta(td_list): return [Timedelta(item).days for item in td_list] df["tdColumn"] = df["tdColumn"].apply(extract_days_from_timedelta)
异常处理优化(可选)
如果列表中存在格式异常的元素(比如没有数字、空值),可以添加安全判断避免报错:
def extract_day_numbers_safe(td_list): result = [] for item in td_list: match = re.search(r"\d+", str(item)) result.append(int(match.group()) if match else None) return result df["tdColumn"] = df["tdColumn"].apply(extract_day_numbers_safe)
内容的提问来源于stack exchange,提问作者Mile
相关产品推荐
相关产品推荐

