合并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)
| date | CST_dts_eCO2_FC_out_SGP30 | CST_dts_IAQ_FC_in_BME680 | CST_dts_eCO2_FC_out_BME680 |
|---|---|---|---|
| 01.07.2022 00:01:00 | 469 | 196 | 891 |
| 24.07.2022 22:46:00 | 1167 | 39 | 12690 |
| 09.08.2022 15:14:00 | 5638 | 25 | 6238 |
| 06.09.2022 18:45:00 | 651 | 186 | 1701 |
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)
| LOCALTIME | x_LowOxyRegeneration_SPS |
|---|---|
| 01.07.2022 02:00:04 | 0.0 |
| 20.08.2022 02:00:09 | 0.0 |
| 02.09.2022 02:00:39 | 1.0 |
| 01.10.2022 01:59:56 | 0.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)
解决方案
问题根源
pd.to_datetime默认自动识别日期格式,当日期字符串中日、月数值均≤12时,会因系统区域设置误判格式(比如01.07.2022可能被解析为1月7日而非7月1日),导致后续格式化后出现格式混乱。- 将
Timestamp转为字符串后,排序会按字符串字典序而非时间顺序,导致绘图时时间轴逻辑异常。
修正步骤
- 显式指定日期解析格式:转换datetime时通过
format参数强制按DD.MM.YYYY HH:MM:SS解析,避免自动识别错误。 - 保留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
相关产品推荐
相关产品推荐

