R语言按时间或索引区间创建日分组分类变量
解答
两种实现方式都可以完成分组标记需求,你可以根据自己的数据质量情况选择对应方案:
方案1:按行索引区间规则生成ID(推荐,逻辑最简)
该方案适用于数据已经严格按采集时间升序排列、无缺行乱序的场景,不需要解析时间字段,运行效率最高。核心逻辑是每1440行归为同一组,按顺序生成ID1、ID2……序列。
- R语言实现(匹配你给出的数据集格式):
# 加载dplyr包,若未安装可先运行 install.packages("dplyr") library(dplyr) df <- df %>% mutate(day_id = paste0("ID", ceiling(row_number() / 1440)))
- Python pandas实现:
import pandas as pd import numpy as np # 按行位置计算分组,不受原索引值影响 df['day_id'] = "ID" + np.ceil(np.arange(1, len(df)+1) / 1440).astype(int).astype(str)
方案2:基于x1.time时间字段生成ID(容错性更高)
如果数据可能存在缺分钟记录、行顺序错乱的情况,按行号分组会出现偏差,推荐用时间字段做分组判断:每当检测到时间为00:00:00时,视为新的一天开始,分组计数加1即可。
- R语言实现:
df <- df %>% mutate( day_count = cumsum(x1.time == "00:00:00"), day_id = paste0("ID", day_count) )
- Python pandas实现:
df['day_count'] = (df['x1.time'] == "00:00:00").cumsum() df['day_id'] = "ID" + df['day_count'].astype(str)
提示:如果
x1.time是时间类型而非字符串,只需要把判断条件替换为「提取时分秒部分是否为0点」即可,核心分组逻辑不变。你也可以同时运行两种方案,对比生成的ID是否完全一致,以此校验数据是否存在缺行、乱序问题。
简单校验方法
生成ID后建议做两步快速校验,避免分组错误:
- 统计每个
day_id对应的记录数,无数据缺失的情况下每个ID应该对应1440条记录,有缺失时记录数会小于1440 - 抽查每个ID分组下的第一条记录时间是否为
00:00:00,最后一条记录时间是否接近23:59:00
内容的提问来源于stack exchange,提问作者Data miner123
相关产品推荐
相关产品推荐

