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

Pandas中将Timedelta天数转为普通值实现DataFrame按天合并问题

问题原因

你遇到的报错有两个核心诱因:

  1. Timedelta类型的Series不能直接用.days取天数:.days是单个Timedelta对象的属性,pandas的Series列需要通过.dt访问器才能批量调用该属性。
  2. 两个待合并表的关联字段名、类型不匹配:你要作为关联键的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:02