使用df.dt.time移除Pandas序列日期后得object类型,无法绘图求助
解决datetime64序列提取时间用于绘图的问题
核心问题原因
用df['time'].dt.time得到的是Python原生datetime.time对象,Pandas将其存储为object类型,多数绘图库无法直接识别这种类型,因此需要转换为Pandas支持的数值型、datetime64或timedelta类型。
可行解决方法
方法1:转换为小时级数值(最适合绘图)
将时间转换为以小时为单位的浮点数,直接作为数值轴使用:
import pandas as pd # 计算时间对应的小时数(含分钟、秒) df['time_hours'] = df['time'].dt.hour + df['time'].dt.minute/60 + df['time'].dt.second/3600 # 筛选早上8点及以后的数据 filtered_df = df[df['time_hours'] >= 8]
这种数值类型绘图时兼容性最好,x轴可以直接按小时刻度展示。
方法2:保留datetime64类型(统一固定日期)
将所有时间的日期替换为同一个固定值,保持datetime64类型不变:
# 设定一个固定日期(任意日期均可) fixed_base = pd.to_datetime('2024-01-01') # 提取原时间的时间差,加上固定日期得到新的datetime64列 df['fixed_date_time'] = fixed_base + (df['time'] - df['time'].dt.normalize()) # 筛选8点后的数据 filtered_df = df[df['fixed_date_time'].dt.hour >= 8]
该方法保留了datetime类型的特性,绘图时会自动识别时间格式,适合需要展示完整时间标签的场景。
方法3:转换为timedelta类型
将时间转换为时间差类型,Pandas和绘图库均支持该类型:
# 将time对象转为字符串后转换为timedelta df['time_delta'] = pd.to_timedelta(df['time'].dt.time.astype(str)) # 筛选8小时及以上的时间差 filtered_df = df[df['time_delta'] >= pd.Timedelta('8 hours')]
timedelta类型在绘图时会以时间差的形式展示刻度,适合强调时间间隔的场景。
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

