You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并Pandas DataFrame时时间戳格式不一致问题求助

问题:合并DataFrame后时间戳格式不一致及图表异常问题

问题说明

合并两个从CSV导出的DataFrame时,原数据时间戳均为DD.MM.YYYY格式,但合并后部分行时间戳变为MM.DD.YYYY格式,其余保持原格式。最初未对时间戳做字符串格式化时,绘图显示异常,无法得到正常效果。

示例数据

df_dts1

dict = {'date' : ['01.07.2022 00:01:00', '24.07.2022 22:46:00', '09.08.2022 15:14:00', '06.09.2022 18:45:00'],
'CST_dts_eCO2_FC_out_SGP30' : [469, 1167, 5638, 651],
'CST_dts_IAQ_FC_in_BME680' : [196, 39, 25, 186],
'CST_dts_eCO2_FC_out_BME680' : [891, 12690, 6238, 1701]}

df_dts1 = pd.DataFrame(dict)
display(df_dts1)
dateCST_dts_eCO2_FC_out_SGP30CST_dts_IAQ_FC_in_BME680CST_dts_eCO2_FC_out_BME680
01.07.2022 00:01:00469196891
24.07.2022 22:46:0011673912690
09.08.2022 15:14:005638256238
06.09.2022 18:45:006511861701

df_OxyMode

dict = {'LOCALTIME' : ['01.07.2022 02:00:04', '20.08.2022 02:00:09', '02.09.2022 02:00:39', '01.10.2022 01:59:56'],
'x_LowOxyRegeneration_SPS' : [0.0, 0.0, 1.0, 0.0]}

df_OxyMode = pd.DataFrame(dict)
display(df_OxyMode)
LOCALTIMEx_LowOxyRegeneration_SPS
01.07.2022 02:00:040.0
20.08.2022 02:00:090.0
02.09.2022 02:00:391.0
01.10.2022 01:59:560.0

当前处理代码

frames = [df_dts1, df_OxyMode]

# 重命名列名统一为Timestamp
df_dts1.rename(columns={'date':'Timestamp'}, inplace=True)
df_OxyMode.rename(columns={'LOCALTIME':'Timestamp'}, inplace=True)

# 转换为datetime类型避免类型不兼容错误
df_dts1['Timestamp'] = pd.to_datetime(df_dts1['Timestamp'])
df_OxyMode['Timestamp'] = pd.to_datetime(df_OxyMode['Timestamp'])

# 排序避免left keys must be sorted错误
df_dts1 = df_dts1.sort_values(by='Timestamp', ascending=True)
df_OxyMode = df_OxyMode.sort_values(by='Timestamp', ascending=True)

# 合并DataFrame
df_ausw = pd.merge_asof(df_dts1, df_OxyMode, on='Timestamp').assign(Timestamp = lambda x: x['Timestamp'].dt.strftime('%d-%m-%Y %H:%M'))
df_ausw = df_ausw.sort_values(by='Timestamp', ascending=True)

display(df_ausw)

解决方案

问题根源

  1. pd.to_datetime默认自动识别日期格式,当日期字符串中日、月数值均≤12时,会因系统区域设置误判格式(比如01.07.2022可能被解析为1月7日而非7月1日),导致后续格式化后出现格式混乱。
  2. 将Timestamp转为字符串后,排序会按字符串字典序而非时间顺序,导致绘图时时间轴逻辑异常。

修正步骤

  1. 显式指定日期解析格式:转换datetime时通过format参数强制按DD.MM.YYYY HH:MM:SS解析,避免自动识别错误。
  2. 保留datetime类型用于绘图:绘图依赖datetime类型的时间轴,不要修改原Timestamp列的类型,如需展示特定格式,新增单独列处理。

修改后代码

# 重命名列名统一为Timestamp
df_dts1.rename(columns={'date':'Timestamp'}, inplace=True)
df_OxyMode.rename(columns={'LOCALTIME':'Timestamp'}, inplace=True)

# 显式指定格式转换datetime,确保解析逻辑正确
df_dts1['Timestamp'] = pd.to_datetime(df_dts1['Timestamp'], format='%d.%m.%Y %H:%M:%S')
df_OxyMode['Timestamp'] = pd.to_datetime(df_OxyMode['Timestamp'], format='%d.%m.%Y %H:%M:%S')

# 排序并合并DataFrame,保留Timestamp为datetime类型
df_dts1 = df_dts1.sort_values(by='Timestamp', ascending=True)
df_OxyMode = df_OxyMode.sort_values(by='Timestamp', ascending=True)

df_ausw = pd.merge_asof(df_dts1, df_OxyMode, on='Timestamp').sort_values(by='Timestamp', ascending=True)

# 新增展示用列,不修改原时间戳列
df_ausw['Timestamp_display'] = df_ausw['Timestamp'].dt.strftime('%d-%m-%Y %H:%M')

display(df_ausw)

额外说明

  • 若需导出数据时使用特定日期格式,可在导出时指定date_format参数,例如df_ausw.to_csv('output.csv', date_format='%d-%m-%Y %H:%M')。
  • 绘图时直接使用Timestamp列作为x轴,pandas会自动识别为时间轴,保证图表逻辑正常。

内容的提问来源于stack exchange,提问作者snkm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:55:48