Python3:时间序列数据的日期格式转换问题求助
问题描述
处理超10万行的时间序列DataFrame时遇到日期格式转换问题:
- 原DataFrame的
datetime列格式为%M:%S.%f(分:秒.毫秒) - 需要转换为
%m/%d/%Y %H:%M:%S.%f格式,以01/01/2023 00:59:57.7作为起始时间,后续时间按序列自动递增(跨小时、天数自动处理)
示例数据
datetime 0 59:57.7 1 00:09.7 2 00:21.8
期望结果
datetime ProcessTime 59:57.7 01/01/2023 00:59:57.7 00:09.7 01/01/2023 01:00:09.7 00:21.8 01/01/2023 01:00:21.8
尝试的代码
import pandas as pd from datetime import datetime # Example dataframe df = pd.DataFrame({'datetime': ['59:57.7', '00:09.7', '00:21.8']}) first_time_str = df['datetime'][0] first_time_obj = datetime.strptime(first_time_str, '%M:%S.%f') formatted_first_time = first_time_obj.replace(year=2023, month=1, day=1).strftime('%m/%d/%Y %H:%M:%S.%f') df['datetime'][0] = formatted_first_time
解决方案
核心思路是将原始分秒值转换为时间差,计算序列中的时间增量,再基于起始时间累加得到完整时间戳。针对10万行数据,优先使用向量化操作保证效率。
完整代码
import pandas as pd from datetime import datetime # 1. 初始化数据 df = pd.DataFrame({'datetime': ['59:57.7', '00:09.7', '00:21.8']}) # 2. 向量化解析原始时间为timedelta(效率远高于apply) # 给原始字符串加上"00:",让pd.to_timedelta能识别为小时:分:秒.毫秒格式 df['time_delta'] = pd.to_timedelta('00:' + df['datetime']) # 3. 计算时间增量:处理跨小时的情况 df['delta'] = df['time_delta'].diff() df.loc[0, 'delta'] = pd.Timedelta(0) # 第一个值的增量为0 # 当后一个时间的分秒小于前一个,说明跨了1小时,给增量补1小时 mask = df['delta'] < pd.Timedelta(0) df.loc[mask, 'delta'] += pd.Timedelta(hours=1) # 4. 计算累计时间增量 df['cumulative_delta'] = df['delta'].cumsum() # 5. 设置起始时间并生成完整时间戳 start_time = datetime(2023, 1, 1, 0, 59, 57, 700000) # 对应01/01/2023 00:59:57.7 df['ProcessTime'] = start_time + df['cumulative_delta'] # 6. 格式化为指定字符串(保留一位毫秒,去掉多余的微秒位) df['ProcessTime'] = df['ProcessTime'].dt.strftime('%m/%d/%Y %H:%M:%S.%f').str[:-3] # 提取需要的列 final_result = df[['datetime', 'ProcessTime']] print(final_result)
代码说明
- 向量化解析:用
pd.to_timedelta替代自定义函数,处理10万行数据时速度更快。 - 跨小时处理:通过判断时间差是否为负,自动补1小时增量,解决分秒从59跳转到00的跨小时问题。
- 时间累加:基于起始时间加上累计增量,生成连续的完整时间序列。
- 格式调整:
strftime生成的%f是6位微秒,通过str[:-3]截断为1位毫秒,匹配需求格式。
内容的提问来源于stack exchange,提问作者Laurent Cesaro
相关产品推荐
相关产品推荐

