繁体   English   中英

根据日期和时间条件删除行 pandas dataframe

[英]Dropping rows based on date & time condition pandas dataframe

根据以下代码,我有两个 DataFrame。

Key_DF = pd.DataFrame({'TC': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'F', 5: 'G'}, 'D_time': {0: '2/5/2021 10:00', 1: '2/5/2021 22:00', 2: '2/7/2021 11:35', 3: '2/8/2021 11:35', 4: '2/9/2021 11:35', 5: '2/10/2021 11:35'}, 'FName': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'A', 5: 'B'}})

Main_DF = pd.DataFrame({'Test Case': {0: 'A', 1: 'A', 2: 'B', 3: 'D', 4: 'D', 5: 'G', 6: 'G'}, 'Timestamp': {0: datetime.datetime(2021, 2, 5, 9, 34, 25), 1: datetime.datetime(2021, 2, 5, 14, 34, 25), 2: 'Wed Nov 25 17:30:12 2020', 3: '11/30/2020 11:48:38 AM', 4: 'Mon Feb 8 13:39:00 2021', 5: 'Mon Feb 9 15:42:50 2021', 6: 'Wed Dec  2 14:56:26 2020'}})

Key_DF.D_time = pd.to_datetime(Key_DF.D_time)
Main_DF.Timestamp = pd.to_datetime(Main_DF.Timestamp)
print (Key_DF)
print (Main_DF)

需要对“Main_DF”进行以下操作。

  1. 提取Key_DF列的数据(例如:“1-1.1”和“2/5/2021 10:00”)
  2. Key_DF 的匹配数(例如:“1-1.1”)与Main_DF
  3. 删除Main_DF.Timestamp > Key_DF.D_time条目
  4. 来自 Main_DF 的新过滤的Main_DF

最终的 output 应如下所示,其中Main_DF.Timestamp > Key_DF.D_time条件应满足。

我可以在这里使用任何格式的时间戳列。

在此处输入图像描述

  • 为了比较日期时间,它们必须是datetime64[ns] dtype
    • 使用.info()检查dtypes
  • 数据框可以在'TC''Test Case'上合并
    • 因此,在合并数据框时, 'TC'列不会作为单独的列添加,它将被重命名为'Test Case'
  • 合并数据帧后,使用 Boolean 选择与df.Timestamp <= df.D_timedf.D_time.isna()
    • df.D_time.isna()将保留'Timestamp'列在'D_time列中没有匹配时间的行。
    • 删除Main_DF.Timestamp > Key_DF.D_time的值与保留df.Timestamp <= df.D_time的值相同
  • 最后的 output 应该有两行'G'
  • 这假定'TC'列中的唯一值,如 OP 中所示
  • 此外,OP 中没有提到'FName'列,因此它被忽略了。
# merged the two dataframes
df = Main_DF.merge(Key_DF[['TC', 'D_time']].rename(columns={'TC': 'Test Case'}), on='Test Case', how='left')

# display(df)
  Test Case           Timestamp              D_time
0         A 2021-02-05 09:34:25 2021-02-05 10:00:00
1         A 2021-02-05 14:34:25 2021-02-05 10:00:00
2         B 2020-11-25 17:30:12 2021-02-05 22:00:00
3         D 2020-11-30 11:48:38 2021-02-08 11:35:00
4         D 2021-02-08 13:39:00 2021-02-08 11:35:00
5         G 2021-02-09 15:42:50 2021-02-10 11:35:00
6         G 2020-12-02 14:56:26 2021-02-10 11:35:00

# filter the dataframe to keep data where Timestame is <= to D_time
df = df[(df.Timestamp <= df.D_time) | df.D_time.isna()].drop(columns=['D_time']).reset_index(drop=True)

# display(df)
  Test Case           Timestamp
0         A 2021-02-05 09:34:25
1         B 2020-11-25 17:30:12
2         D 2020-11-30 11:48:38
3         G 2021-02-09 15:42:50
4         G 2020-12-02 14:56:26

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM