pandas Panda迭代dataframe并将data-time与另一个dataframe的data-time进行比较,并找到最接近的日期时间值(一个较小,一个较大)

hfsqlsce  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(116)

我有两个csv文件-
CSV A-

Col1        Date/Time         Col3    
75      2023/01/02 15:37:53 52582.12
23      2023/01/02 15:38:11 52577.12

CSV B-

Col1   Col2       Date/Time             Col4       Col5       Col6
23      XY      2023/01/02 15:37:49  NO_ERROR  NO_ERROR      AA
25      AB      2023/01/02 15:37:51  NO_ERROR  NO_ERROR      BB
31      CF      2023/01/02 15:37:56  NO_ERROR  NO_ERROR      CC 
35      CV      2023/01/02 15:38:10     ERROR  NO_ERROR      DD
76      FH      2023/01/02 15:38:15  NO_ERROR  NO_ERROR      EE
79      FG      2023/01/02 15:38:21  NO_ERROR  NO_ERROR      FF

我想迭代CSV-A并将日期/时间与CSV-B“日期/时间”列进行比较,并从CSV-B中找出2个闭包“日期/时间”(一个较小,一个较大),并将这2个闭包“日期/时间”和其他几个列附加在同一行中,如下所示-

A_df = pd.read_csv('csv_A')
B_df = pd.read_csv('csv_B',usecols = ['Date/Time','Col2','Col4'])
for _, row in A_df.iterrows():
//compare date logic and append output into existing row OR create separate dataframe.

我需要的最终输出如下-

Col1     Date/Time           Col3     CSV_B_Date_Smaller  CSV_B_Col2   CSV_B_Date_greater  CSV_B_Col2
Row 1 -   75    2023/01/02 15:37:53  52582.12   2023/01/02 15:37:51     AB      2023/01/02 15:37:56     CF
Row 1 -   23    2023/01/02 15:38:11  52577.12   2023/01/02 15:38:10     CV      2023/01/02 15:38:15     FH

谢谢你的帮助提前。

nbnkbykc

nbnkbykc1#

使用双merge_asof,一次使用direction='backward',另一次使用direction='forward'

A_df['Date/Time'] = pd.to_datetime(A_df['Date/Time'])
B_df['Date/Time'] = pd.to_datetime(B_df['Date/Time'])

cols = ['Date/Time', 'Col2']

out = pd.merge_asof(
    pd.merge_asof(
        A_df,
        B_df[cols].rename(columns={'Date/Time': 'CSV_B_Date'}).add_suffix('_Smaller'),
        left_on='Date/Time',
        right_on='CSV_B_Date_Smaller',
        direction='backward',
    ),
    B_df[cols].rename(columns={'Date/Time': 'CSV_B_Date'}).add_suffix('_greater'),
    left_on='Date/Time',
    right_on='CSV_B_Date_greater',
    direction='forward',
)
  • 注意:这里我假设两个 Dataframe 已经按日期排序(merge_asof需要)。*

输出:

Col1           Date/Time      Col3  CSV_B_Date_Smaller Col2_Smaller  CSV_B_Date_greater Col2_greater
0    75 2023-01-02 15:37:53  52582.12 2023-01-02 15:37:51           AB 2023-01-02 15:37:56           CF
1    23 2023-01-02 15:38:11  52577.12 2023-01-02 15:38:10           CV 2023-01-02 15:38:15           FH

相关问题