在Pandas中拆分DataFrame的Difference列生成Day新列求助
解决方法:从Timedelta列提取天数到新列
嘿,我来帮你搞定这个问题!你遇到的核心问题是没注意到Difference列的类型——它是pandas Timedelta(时间差)对象,不是普通字符串,所以之前的字符串拆分方法才会失效。下面给你两种可行的方案,优先推荐第一种:
方案1:直接使用Timedelta的.dt.days属性(最推荐)
pandas为时间差类型的Series提供了.dt访问器,可以直接提取天数、小时等属性,这是最简洁高效的方式,完全不需要做字符串处理:
import pandas as pd import datetime # 创建DataFrame df df = pd.DataFrame({'sample_date':['2018-01-10','2018-01-10','2018-01-11','2018-01-11','2018-01-12']}) # 获取当前日期,撰写本文时为2018-01-12 today = datetime.date.today() # 为df添加新列Today df['Today'] = today # 将所有列转换为datetime类型 df['sample_date'] = pd.to_datetime(df['sample_date']) df['Today'] = pd.to_datetime(df['Today']) # 创建新列Difference,计算Today与sample_date的差值 df['Difference'] = df['Today'] - df['sample_date'] # 重点:提取天数到Day列 df['Day'] = df['Difference'].dt.days
运行后你会得到完全符合预期的输出:
| sample_date | Today | Difference | Day |
|---|---|---|---|
| 2018-01-10 | 2018-01-12 | 2 days 00:00:00.000000000 | 2 |
| 2018-01-10 | 2018-01-12 | 2 days 00:00:00.000000000 | 2 |
| 2018-01-11 | 2018-01-12 | 1 days 00:00:00.000000000 | 1 |
| 2018-01-11 | 2018-01-12 | 1 days 00:00:00.000000000 | 1 |
| 2018-01-12 | 2018-01-12 | 0 days 00:00:00.000000000 | 0 |
方案2:字符串拆分(不推荐,仅作参考)
如果你非要用字符串拆分的方式,需要先把Timedelta对象转为字符串,再用.str访问器逐元素拆分(注意不是把整个Series转成字符串!之前的错误就是在这里):
# 把Difference转成字符串后拆分,取第一个元素 df['Day'] = df['Difference'].astype(str).str.split().str[0]
这种方法虽然能得到结果,但不如方案1稳定——如果时间差的格式发生变化(比如包含小时、分钟),字符串拆分可能会出错,而.dt.days是直接从时间差对象中提取数值,可靠性更高。
为什么你之前的方法出错?
你尝试的str(df['Today'] - df['sample_date']).split()[0]是把整个Series对象转成了字符串(比如输出会是类似0 2 days...\n1 2 days...的格式),拆分后取第一个元素是索引的0,所以所有行的Difference都变成了0,这显然不是你想要的效果。
内容的提问来源于stack exchange,提问作者Code_Sipra
相关产品推荐
相关产品推荐

