为Pandas DataFrame指定行时间戳加3小时后格式异常,如何解决?
问题分析
你遇到的问题核心在于原始的Time列是字符串类型:当你把它转换成TimedeltaIndex进行计算后,得到的结果是Timedelta对象,直接赋值回DataFrame时,Pandas会自动将其转换为内部存储的纳秒数值(也就是你看到的一大串数字),而非你期望的时间字符串格式。另外你代码里还有个小细节:用硬编码的列索引3定位Time列不够稳妥,建议用列名动态获取索引,避免列顺序变化导致错误。
解决方案步骤
要实现给最后4行时间加3小时并保持字符串格式,需要分三步:
- 将字符串类型的
Time列转换为时间差(Timedelta)类型,方便进行时间运算 - 对指定行的时间差加上3小时
- 将运算后的时间差重新转换为
HH:MM:SS格式的字符串
完整修正代码
import pandas as pd import random from datetime import timedelta def randomTime(): rtime = int(random.random()*86400) hours = int(rtime/3600) minutes = int((rtime - hours*3600)/60) seconds = rtime - hours*3600 - minutes*60 time_string = '%02d:%02d:%02d' % (hours, minutes, seconds) return time_string time = [randomTime() for _ in range(8)] k = 5 N = 8 d = ({'Time' : (time), 'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL'], 'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx'], 'Number2' : ['xx',1,'xx',1,'xx',2,'xx',2]}) df = pd.DataFrame(data=d) # 步骤1:将Time列转为Timedelta类型,支持时间运算 df['Time'] = pd.to_timedelta(df['Time']) # 步骤2:给最后4行的时间加上3小时,用列名获取索引更可靠 time_col_idx = df.columns.get_loc('Time') df.iloc[4:8, time_col_idx] += timedelta(hours=3) # 步骤3:将Timedelta转回HH:MM:SS格式的字符串 # Timedelta转字符串后会带"0 days "前缀,分割后取时间部分即可 df['Time'] = df['Time'].astype(str).str.split().str[-1] print(df)
代码说明
pd.to_timedelta(df['Time']):把字符串格式的时间转成Timedelta类型,这是进行时间加法运算的前提df.columns.get_loc('Time'):通过列名动态获取列索引,比硬编码数字3更灵活,即使列顺序改变也不会出错df['Time'].astype(str).str.split().str[-1]:Timedelta转字符串后会显示类似0 days 17:25:51的格式,我们只需要后面的时间部分,所以用split()分割后取最后一段
示例输出
运行后你会得到符合预期的结果,时间保持字符串格式且最后4行成功加了3小时:
Events Number1 Number2 Time 0 ABC xx xx 14:25:51 1 DEF xx 1 10:02:32 2 GHI 1 xx 01:23:32 3 JKL xx 1 07:27:42 4 ABC xx xx 17:25:51 5 DEF xx 2 13:02:32 6 GHI 2 xx 04:23:32 7 JKL xx 2 10:27:42
内容的提问来源于stack exchange,提问作者user9394674
相关产品推荐
相关产品推荐

