Pandas DataFrame日期时间索引极值获取与timedelta计算方法
报错原因
- 触发
AttributeError: 'DataFrame' object has no attribute 'time'是因为time是DataFrame的索引,不是普通数据列,无法通过df.time的属性方式访问,必须通过索引对象取值。 - 触发
TypeError: int() argument must be a string, a bytes-like object or a number, not 'Timestamp'是因为df.index.min()返回的是PandasTimestamp类型对象,不能直接传入int()强转;同时原逻辑里把时间转成字符串后再做减法的写法本身也不成立,字符串类型无法直接计算时间差。
正确实现方案
获取Datetime索引的统计值
对于设置为datetime类型的索引(DatetimeIndex),直接调用索引的聚合方法即可获取min、max这类统计值,返回结果为Pandas标准Timestamp对象:
# 获取索引的最早、最晚时间 start_ts = df.index.min() end_ts = df.index.max() # 其他常用统计值可直接同逻辑调用 time_avg = df.index.mean() # 时间平均值 time_mid = df.index.median() # 时间中位数
timedelta计算与目标代码修正
时间差计算要在时间对象层面完成,不要先转成字符串再运算。
推荐方案:Pandas原生运算(写法最简洁)
不需要额外转换Python原生类型,Pandas原生支持时间算术运算:
# 直接计算时长,返回Pandas Timedelta类型 duration = end_ts - start_ts # 支持按需转换单位 print(duration) # 输出格式示例:0 days 01:35:44 print(duration.total_seconds()) # 转总秒数,输出示例:5744.0 # 生成带UTC标识的时间字符串,按需自定义格式 starttime = start_ts.strftime("%Y-%m-%d %H:%M:%S") + " UTC" endtime = end_ts.strftime("%Y-%m-%d %H:%M:%S") + " UTC"
备选方案:转Python原生timedelta计算
如果必须使用Python标准库timedelta,要先调用Timestamp对象的timestamp()方法获取Unix秒级时间戳,再做转换:
from datetime import timedelta # 先获取Unix时间戳再转timedelta start_td = timedelta(seconds=int(start_ts.timestamp())) end_td = timedelta(seconds=int(end_ts.timestamp())) duration = end_td - start_td # 原生timedelta类型时长 # 生成带UTC标识的字符串 starttime = str(start_td) + " UTC" endtime = str(end_td) + " UTC"
注意:该方案生成的时间字符串是从Unix纪元(1970-01-01 00:00:00 UTC)开始累加的时间间隔格式,不会展示你数据里2022年的真实日期,如果需要展示实际业务时间,优先使用推荐方案的
strftime格式化写法。
内容的提问来源于stack exchange,提问作者Swawa
相关产品推荐
相关产品推荐

