按最近的日期时间连接两个数据框
Join two dataframes by the closest datetime
我有两个数据框 df_A
和 df_B
,每个数据框都有日期、时间和一个值。下面的例子:
import pandas as pd
df_A = pd.DataFrame({
'date_A': ["2021-02-01", "2021-02-01", "2021-02-02"],
'time_A': ["22:00:00", "23:00:00", "00:00:00"],
'val_A': [100, 200, 300]})
df_B = pd.DataFrame({
'date_B': ["2021-02-01", "2021-02-01", "2021-02-01", "2021-02-01", "2021-02-02"],
'time_B': ["22:01:12", "22:59:34", "23:00:17", "23:59:57", "00:00:11"],
'val_B': [104, 203, 195, 296, 294]})
我需要加入这个数据框,但日期和时间不匹配。所以我想要从 df_B
到 df_A
最近的日期时间进行左连接。所以输出应该是:
df_out = pd.DataFrame({
'date_A': ["2021-02-01", "2021-02-01", "2021-02-02"],
'time_A': ["22:00:00", "23:00:00", "00:00:00"],
'val_A': [100, 200, 300],
'date_B': ["2021-02-01", "2021-02-01", "2021-02-01"],
'time_B': ["22:01:12", "23:00:17", "23:59:57"],
'val_B': [104, 195, 296]})
df_out
Pandas 有一个方便的 merge_asof()
函数来解决这些类型的问题 (https://pandas.pydata.org/docs/reference/api/pandas.merge_asof.html)
合并需要一个键,因此您可以在每个数据框中创建一个日期时间列并执行合并:
df_A['date_time'] = pd.to_datetime(df_A.date_A + " " + df_A.time_A)
df_B['date_time'] = pd.to_datetime(df_B.date_B + " " + df_B.time_B)
# Sort the two dataframes by the new key, as required by merge_asof function
df_A.sort_values(by="date_time", inplace=True, ignore_index=True)
df_B.sort_values(by="date_time", inplace=True, ignore_index=True)
result_df = pd.merge_asof(df_A, df_B, on="date_time", direction="nearest")
请注意,方向参数的值是您要求的“最近的”。您还可以选择其他值,例如“向后”和“向前”。
我有两个数据框 df_A
和 df_B
,每个数据框都有日期、时间和一个值。下面的例子:
import pandas as pd
df_A = pd.DataFrame({
'date_A': ["2021-02-01", "2021-02-01", "2021-02-02"],
'time_A': ["22:00:00", "23:00:00", "00:00:00"],
'val_A': [100, 200, 300]})
df_B = pd.DataFrame({
'date_B': ["2021-02-01", "2021-02-01", "2021-02-01", "2021-02-01", "2021-02-02"],
'time_B': ["22:01:12", "22:59:34", "23:00:17", "23:59:57", "00:00:11"],
'val_B': [104, 203, 195, 296, 294]})
我需要加入这个数据框,但日期和时间不匹配。所以我想要从 df_B
到 df_A
最近的日期时间进行左连接。所以输出应该是:
df_out = pd.DataFrame({
'date_A': ["2021-02-01", "2021-02-01", "2021-02-02"],
'time_A': ["22:00:00", "23:00:00", "00:00:00"],
'val_A': [100, 200, 300],
'date_B': ["2021-02-01", "2021-02-01", "2021-02-01"],
'time_B': ["22:01:12", "23:00:17", "23:59:57"],
'val_B': [104, 195, 296]})
df_out
Pandas 有一个方便的 merge_asof()
函数来解决这些类型的问题 (https://pandas.pydata.org/docs/reference/api/pandas.merge_asof.html)
合并需要一个键,因此您可以在每个数据框中创建一个日期时间列并执行合并:
df_A['date_time'] = pd.to_datetime(df_A.date_A + " " + df_A.time_A)
df_B['date_time'] = pd.to_datetime(df_B.date_B + " " + df_B.time_B)
# Sort the two dataframes by the new key, as required by merge_asof function
df_A.sort_values(by="date_time", inplace=True, ignore_index=True)
df_B.sort_values(by="date_time", inplace=True, ignore_index=True)
result_df = pd.merge_asof(df_A, df_B, on="date_time", direction="nearest")
请注意,方向参数的值是您要求的“最近的”。您还可以选择其他值,例如“向后”和“向前”。