按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
相关产品推荐
相关产品推荐

