如何让pd.concat基于DatetimeIndex列正确合并两个Pandas DataFrames?
解决Pandas基于DatetimeIndex合并DataFrames的问题
你的问题出在未将日期列设置为DataFrame的索引,pd.concat默认按整数位置索引(0、1、2...)对齐,而非日期值,所以才会出现日期偏移、重复日期列的情况。以下是两种正确的解决方法:
方法一:设置DatetimeIndex后用pd.concat
先将两个DataFrame的dtm列转为DatetimeIndex,再基于索引进行内连接拼接:
import pandas as pd import numpy as np df1 = pd.DataFrame(data=pd.date_range('2022-01-02','2022-01-04'), columns=['dtm']) df1['var1'] = np.random.random(len(df1)) # 将dtm设为DatetimeIndex df1 = df1.set_index('dtm') df2 = pd.DataFrame(data=pd.date_range('2022-01-01','2022-01-05'), columns=['dtm']) df2['var2'] = np.random.random(len(df2))*100 df2 = df2.set_index('dtm') # 按索引内连接拼接 result = pd.concat([df1, df2], axis=1, join='inner') # 可选:将索引转回列 result = result.reset_index() print(result)
输出示例:
dtm var1 var2 0 2022-01-02 0.942075 62.548033 1 2022-01-03 0.857628 3.883448 2 2022-01-04 0.432774 45.123456
方法二:直接使用pd.merge(更直观)
即使dtm是datetime类型,pd.merge依然可以正常按列匹配,不需要转索引:
import pandas as pd import numpy as np df1 = pd.DataFrame(data=pd.date_range('2022-01-02','2022-01-04'), columns=['dtm']) df1['var1'] = np.random.random(len(df1)) df2 = pd.DataFrame(data=pd.date_range('2022-01-01','2022-01-05'), columns=['dtm']) df2['var2'] = np.random.random(len(df2))*100 # 按dtm列内连接合并 result = pd.merge(df1, df2, on='dtm', how='inner') print(result)
该方法直接指定合并键为dtm,内连接会自动保留两个DataFrame共有的日期,且仅保留一个dtm列,完全符合你的需求。
内容的提问来源于stack exchange,提问作者AstroFloyd
相关产品推荐
相关产品推荐

