Pandas中将Timedelta天数转为普通值实现DataFrame按天合并问题
问题原因
你遇到的报错有两个核心诱因:
- Timedelta类型的Series不能直接用
.days取天数:.days是单个Timedelta对象的属性,pandas的Series列需要通过.dt访问器才能批量调用该属性。 - 两个待合并表的关联字段名、类型不匹配:你要作为关联键的
day字段,在df1(missing表)里实际字段名是date,存储的是1-30的整数;在df2里计算得到的是Timedelta类型的days字段,二者类型和名称都不匹配,自然无法关联。
修正步骤
1. 修正df1(missing表)的字段名
将你实际用来表示天数的date字段重命名为day,和关联键一致:
import pandas as pd import numpy as np from itertools import product # 替换为你实际定义的vec值 vec = ['1','2','3'] missing = pd.DataFrame(product(range(1,31), range(1,5)), columns=['day','time_of_day']) missing = pd.concat([missing.assign(pid=_id) for _id in vec], ignore_index=True) missing.pid = missing.pid.astype(str)
2. 修正df2的天数提取逻辑
用.dt.days把Timedelta列转换为整数类型的day字段,和df1的字段类型对齐:
def random_dates(start, end, n=12): start_u = start.value//10**9 end_u = end.value//10**9 return pd.to_datetime(np.random.randint(start_u, end_u, n), unit='s') start = pd.to_datetime('2015-01-01') end = pd.to_datetime('2018-01-01') df = pd.DataFrame({'datestamp':random_dates(start, end)}) df['date'] = pd.to_datetime(df['datestamp']).dt.date df['time'] = pd.to_datetime(df['datestamp']).dt.time df = pd.concat([df.assign(pid=_id) for _id in vec], ignore_index=True) df.pid = df.pid.astype(str) # 对齐pid的字符串类型 df['last'] = df.sort_values('date').groupby('pid')['date'].transform('last') # 关键修改:通过.dt.days提取整数天数,字段名改为day和关联键一致 df['day'] = (df['last'] - df['date']).dt.days
3. 执行合并
此时两个表的pid和day字段的名称、类型完全匹配,可以正常合并:
merged_df = missing.merge(df, how = 'left', on = ['pid', 'day'])
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

