You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按批次去除连续批次中重复日期记录的实现方法问询

批次重复日期记录移除方案

先看你的样本数据:

x_TimeGenerated  batch_number
      22/03/2023    BATCH_1
      21/03/2023    BATCH_1
      20/03/2023    BATCH_1
      19/03/2023    BATCH_1
      18/03/2023    BATCH_1
      18/03/2023    BATCH_2
      17/03/2023    BATCH_2
      16/03/2023    BATCH_2
      15/03/2023    BATCH_2
      14/03/2023    BATCH_2
      14/03/2023    BATCH_3
      13/03/2023    BATCH_3
      12/03/2023    BATCH_3
      11/03/2023    BATCH_3
      10/03/2023    BATCH_3

需求明确:每个日期只保留最早出现批次中的所有记录,后续批次里的相同日期记录全部删除。下面给两种常用实现方案:

方案一:Python Pandas处理

如果用Python做数据清洗,直接按以下步骤执行:

  1. 加载数据并转换日期格式(避免字符串排序出错)
  2. 找出每个日期对应的最早批次
  3. 筛选出仅保留最早批次的记录

代码示例:

import pandas as pd

# 加载数据(这里模拟数据,实际可从CSV/Excel读取)
df = pd.DataFrame({
    'x_TimeGenerated': ['22/03/2023', '21/03/2023', '20/03/2023', '19/03/2023', '18/03/2023',
                        '18/03/2023', '17/03/2023', '16/03/2023', '15/03/2023', '14/03/2023',
                        '14/03/2023', '13/03/2023', '12/03/2023', '11/03/2023', '10/03/2023'],
    'batch_number': ['BATCH_1', 'BATCH_1', 'BATCH_1', 'BATCH_1', 'BATCH_1',
                     'BATCH_2', 'BATCH_2', 'BATCH_2', 'BATCH_2', 'BATCH_2',
                     'BATCH_3', 'BATCH_3', 'BATCH_3', 'BATCH_3', 'BATCH_3']
})

# 转换日期列格式,确保后续逻辑准确
df['x_TimeGenerated'] = pd.to_datetime(df['x_TimeGenerated'], format='%d/%m/%Y')

# 按日期分组,获取每个日期最早出现的批次
earliest_batch = df.groupby('x_TimeGenerated')['batch_number'].min().reset_index()
earliest_batch.columns = ['x_TimeGenerated', 'earliest_batch']

# 合并筛选,保留仅属于最早批次的记录
cleaned_df = df.merge(earliest_batch, on='x_TimeGenerated')
cleaned_df = cleaned_df[cleaned_df['batch_number'] == cleaned_df['earliest_batch']].drop(columns='earliest_batch')

# 查看处理后的数据
print(cleaned_df)

运行后,BATCH_2的18/03/2023、BATCH_3的14/03/2023记录会被全部移除,剩下的就是每个日期仅保留最早批次的完整数据。

方案二:SQL处理

如果数据存储在数据库中,用窗口函数可以快速实现:

假设你的表名为batch_data,字段为x_TimeGenerated(日期类型)和batch_number(字符串类型),执行以下SQL语句:

SELECT x_TimeGenerated, batch_number
FROM (
    SELECT 
        x_TimeGenerated, 
        batch_number,
        -- 按日期分组,给批次排序,最早的批次标记为1
        ROW_NUMBER() OVER (
            PARTITION BY x_TimeGenerated 
            ORDER BY CAST(SUBSTRING(batch_number, 7) AS INT) ASC
        ) AS rn
    FROM batch_data
) AS t
WHERE rn = 1;

这里用SUBSTRING(batch_number,7)提取批次后的数字(比如从BATCH_1提取1),转成整数排序,避免出现BATCH_10排在BATCH_2前面的错误逻辑。执行后只会保留每个日期最早批次的所有记录。


内容的提问来源于stack exchange,提问作者Lopa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:43:22