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

按ID分组每小时仅保留1行数据,删除其余行的实现方法

实现方法

1. SQL 方式

核心逻辑是按ID和小时级时间维度分组,保留每组内的一条记录(示例取最早的一条,可按需调整规则)。

MySQL 示例

-- 取每个ID每小时的最早记录
SELECT ID, MIN(DateTime) AS DateTime
FROM your_table
GROUP BY ID, DATE_FORMAT(DateTime, '%Y-%m-%d %H:00:00');

如果需要更灵活的筛选(比如保留任意一条或指定规则的记录),用窗口函数:

WITH ranked_records AS (
    SELECT 
        ID,
        DateTime,
        -- 按ID和小时分组,给每组内记录排序
        ROW_NUMBER() OVER (
            PARTITION BY ID, DATE_FORMAT(DateTime, '%Y-%m-%d %H') 
            ORDER BY DateTime -- 升序取第一条,降序则取最后一条
        ) AS row_num
    FROM your_table
)
SELECT ID, DateTime
FROM ranked_records
WHERE row_num = 1;

PostgreSQL 示例

仅需将DATE_FORMAT替换为DATE_TRUNC:

SELECT ID, MIN(DateTime) AS DateTime
FROM your_table
GROUP BY ID, DATE_TRUNC('hour', DateTime);

2. Python Pandas 方式

通过时间分组+聚合实现:

import pandas as pd

# 构造数据(实际场景可从文件读取)
df = pd.DataFrame({
    'ID': [1,1,1,2,2,2],
    'DateTime': ['2022-01-30 01:02:03', '2022-01-30 01:34:03', '2022-01-30 02:59:03',
                 '2022-01-30 01:02:03', '2022-01-30 01:34:03', '2022-01-30 02:59:03']
})

# 转换为时间类型
df['DateTime'] = pd.to_datetime(df['DateTime'])

# 按ID和小时分组,取每组第一条记录
result = df.groupby(
    ['ID', df['DateTime'].dt.floor('hour')]
).first().reset_index(drop=False).drop(columns='DateTime')

# 重命名列并调整顺序
result = result.rename(columns={'level_1': 'DateTime'})[['ID', 'DateTime']]

print(result)

3. Excel 方式

用辅助列+删除重复项快速处理:

  • 步骤1:确保DateTime列为日期时间格式。
  • 步骤2:添加辅助列,输入公式提取小时维度:=TEXT(B2,"yyyy-mm-dd hh")(假设DateTime在B列)。
  • 步骤3:选中ID列和辅助列,点击「数据」→「删除重复值」,保留第一条记录即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:20:52