如何合并同日期不同时间记录的两个Pandas DataFrame?
如何合并两个同结构但时间点不同的Pandas DataFrame并按时间排序?
我明白你的需求了——你需要把两个结构相同、日期范围一致但时间点不重叠的DataFrame合并成一个,并且所有行按datetime字段的时间顺序排列,而不是简单把第二个df接在第一个后面,或者变成多列。
下面是具体的解决方案:
核心思路
先确保datetime列为datetime类型(保证排序逻辑正确),然后用pd.concat()合并两个DataFrame的行,最后按datetime字段排序即可。
完整代码示例
先构造你提供的示例数据,再执行合并操作:
import pandas as pd # 构造df1 df1_data = { 'datetime': ['2011-01-01 2:00', '2011-01-01 4:00', '2011-01-01 5:00', '2011-01-01 7:00', '2011-01-01 8:00', '2011-01-01 10:00'], 'temperature': [12, 12, 13, 18, 21, 21] } df1 = pd.DataFrame(df1_data) df1['datetime'] = pd.to_datetime(df1['datetime']) # 构造df2 df2_data = { 'datetime': ['2011-01-01 0:00', '2011-01-01 3:00', '2011-01-01 6:00', '2011-01-01 9:00'], 'temperature': [13, 11.6, 15, 20.6] } df2 = pd.DataFrame(df2_data) df2['datetime'] = pd.to_datetime(df2['datetime']) # 合并并按时间排序,重置索引 merged_df = pd.concat([df1, df2]).sort_values(by='datetime').reset_index(drop=True) print(merged_df)
运行结果
输出就是你期望的按时间顺序排列的合并DataFrame:
datetime temperature 0 2011-01-01 00:00:00 13.0 1 2011-01-01 02:00:00 12.0 2 2011-01-01 03:00:00 11.6 3 2011-01-01 04:00:00 12.0 4 2011-01-01 05:00:00 13.0 5 2011-01-01 06:00:00 15.0 6 2011-01-01 07:00:00 18.0 7 2011-01-01 08:00:00 21.0 8 2011-01-01 09:00:00 20.6 9 2011-01-01 10:00:00 21.0
为什么之前的方法不符合预期?
df.append():虽然能合并行,但默认保留两个df原来的顺序,df2的所有行都会排在df1后面,不会自动按时间排序。pd.merge():这个方法是按指定键匹配合并,默认会把相同datetime的行合并成一行,不同datetime的行则会出现缺失值,最终结果是左右扩展的结构,和你想要的单行时间序列不符。
额外提示
如果你的原始DataFrame中datetime列还不是datetime类型,一定要先转换,否则字符串排序可能出错(比如"2011-01-01 10:00"会排在"2011-01-01 2:00"前面,因为字符串是按字符顺序比较的)。
内容的提问来源于stack exchange,提问作者Behnam
相关产品推荐
相关产品推荐

