如何高效将Pandas DataFrame时间列转换为datetime.time对象
高效提取Datetime列的时分秒部分(9万+行数据集)
针对你的9万+行传感器数据集,以下是几种高效的处理方案,按性能从高到低排序:
方法1:提取datetime.time对象(最优性能,矢量化操作)
直接利用Pandas的dt.time属性,这是原生矢量化操作,处理大数据量速度最快,且保留时间的结构化信息:
df = pd.read_csv('RAB_EXP1_7d_DFT.CSV') df['Time'] = pd.to_datetime(df['Time']) # 提取时分秒部分,得到datetime.time类型对象 df['Time_of_day'] = df['Time'].dt.time
处理后输出示例:
0 12:20:21 1 12:20:26 2 12:20:31 ... 89971 17:17:55 Name: Time_of_day, dtype: object
这种格式的时间可以直接被Matplotlib识别,适合后续绘图分析。
方法2:格式化为字符串(按需使用)
如果需要纯文本格式的时分秒,可以用dt.strftime,性能略低于方法1,但满足文本展示需求:
df['Time_str'] = df['Time'].dt.strftime('%H:%M:%S')
方法3:转换为当日秒数(适合数值化分析)
若后续绘图或分析需要数值化的时间(比如计算一天内的相对时长),可以将时间转为当日累计秒数,方便做数值过滤和计算:
# 方式1:手动计算秒数 df['Seconds_of_day'] = df['Time'].dt.hour * 3600 + df['Time'].dt.minute * 60 + df['Time'].dt.second # 方式2:利用timedelta计算总秒数(更简洁) df['Seconds_of_day'] = (df['Time'] - df['Time'].dt.normalize()).dt.total_seconds()
这种数值化的时间适合精准筛选时段,也能避免跨天日期的干扰。
后续绘图实践建议
针对你寻找读数大于0时段的需求,推荐结合方法1或方法3使用:
- 用
dt.time格式:Matplotlib可直接渲染时间轴,直观展示时段分布; - 用秒数格式:便于做数值范围筛选(比如筛选早8点到晚6点的数据),也能更灵活地调整图表刻度。
绘图示例代码
import matplotlib.pyplot as plt # 筛选读数大于0的数据 filtered_df = df[df['Reading'] > 0] plt.figure(figsize=(12, 6)) plt.plot(filtered_df['Time_of_day'], filtered_df['Reading'], marker='.', linestyle='', alpha=0.6) plt.xlabel('Time of Day') plt.ylabel('Sensor Reading') plt.title('Sensor Readings > 0 by Time of Day') plt.xticks(rotation=45) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者kfir648
相关产品推荐
相关产品推荐

