使用 Pandas,您可以将多个数据帧与时间戳列和公共列(在本例中)站、经度、纬度和多个变量列合并在单独的文件中,但不能重复公共列,或者在时间列中具有多行最终结果?
pd.merge(以及 merge_ordered 和 merge_asof)似乎无法与多列索引一起正常工作,或者它返回车站、纬度和经度的重复后缀列。
将时间列转换为日期时间索引并使用 pd.concat 似乎是正确的方法...但是如何修复单独的时间行并摆脱 NaN 值?我认为索引上的 groupby 可能是一种可行的方法,但是如何呢?
如果没有代码示例,可能很难重现您的问题。我手工制作了两个 DataFrame 来复制您的数据。
index_common = [
datetime(2023,1,1,0,0,0,0).strftime('%Y-%m-%dT%H:%M:%SZ'),
datetime(2023,1,1,1,0,0,0).strftime('%Y-%m-%dT%H:%M:%SZ'),
datetime(2023,1,1,2,0,0,0).strftime('%Y-%m-%dT%H:%M:%SZ')
]
data_1 = {
'station': ['GridPointRequestedAt[23.553S_133.396E]']*3,
'longitude': [-23.53]*3,
'latitude': [133.36]*3,
'ta50m': [300.11, 301.61, 303.60]
}
data_2 = {
'station': ['GridPointRequestedAt[23.553S_133.396E]']*3,
'longitude': [-23.53]*3,
'latitude': [133.36]*3,
'ua50m': [-3.38, -5.17, -7.21]
}
df_1 = pd.DataFrame(data=data_1, index=index_common)
df_2 = pd.DataFrame(data=data_2, index=index_common)
当查看它们时,它们共享一个共同的时间戳索引。
In [1]: df1
Out[1]:
station longitude latitude ta50m
2023-01-01T00:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 300.11
2023-01-01T01:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 301.61
2023-01-01T02:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 303.60
In [2]: df2
Out[2]:
station longitude latitude ua50m
2023-01-01T00:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 -3.38
2023-01-01T01:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 -5.17
2023-01-01T02:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 -7.21
这里的想法是重置两个 DataFrame 的索引,并使用
pd.merge
函数将 DataFrame 合并到前时间戳索引和公共列上:
df_merged = df_1.reset_index(names=['timestamp']).merge(
df_2.reset_index(names=['timestamp']),
how='inner',
on=['timestamp', 'station', 'longitude', 'latitude']
)
最后,如果您需要让时间戳作为索引而不是作为适当的列,您可以运行:
df_merged.set_index("timestamp")
In [3]: df_merged
Out[3]:
station longitude latitude ta50m ua50m
timestamp
2023-01-01T00:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 300.11 -3.38
2023-01-01T01:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 301.61 -5.17
2023-01-01T02:00:00Z GridPointRequestedAt[23.553S_133.396E] -23.53 133.36 303.60 -7.21
PS: 要轻松共享数据示例,您可以运行
df.head().to_dict()
并在此处共享输出。