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

如何从其他列补全缺失的lubridate类型下车时间?

解决方案

核心思路

按出租车分组,仅对有后续接客记录的缺失下车时间,用下一次接客时间减1秒补全;无后续接客的分组(如出租车2)因无数据支撑,缺失值保留NA。同时用lubridate处理时间运算,按需转换为指定格式。

完整代码

library(dplyr)
library(lubridate)

# 原始数据生成(保留你的复现代码)
x <- seq(as.POSIXct('2020/01/01'), 
         as.POSIXct('2030/01/01'),
         by = "10 mins") %>% 
  head(20) %>%
  sort()

taxi_nr <- c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4)

drop_of <- x[c(TRUE, FALSE)]
pick_up <- x[c(FALSE, TRUE)]

drop_of[2] <- NA
drop_of[5] <- NA
drop_of[7] <- NA

df <- data.frame(taxi_nr,pick_up,drop_of) %>%
  arrange(pick_up)

# 补全缺失值+格式转换
df_clean <- df %>%
  group_by(taxi_nr) %>%
  mutate(
    # 仅补全有后续接客记录的缺失下车时间
    drop_of = case_when(
      is.na(drop_of) & !is.na(lead(pick_up)) ~ lead(pick_up) - seconds(1),
      TRUE ~ drop_of
    ),
    # 转换为d/m/y-h/m/s字符串格式(若需保留lubridate时间对象可删除此两行)
    pick_up = format(pick_up, "%d/%m/%Y-%H:%M:%S"),
    drop_of = ifelse(!is.na(drop_of), format(drop_of, "%d/%m/%Y-%H:%M:%S"), NA)
  ) %>%
  ungroup()

# 查看结果
print(df_clean)

代码细节说明

  • group_by(taxi_nr):确保每辆出租车的时间逻辑独立,不会跨车取数
  • lead(pick_up):获取当前分组内下一行的接客时间,无后续记录时返回NA
  • case_when():精准控制补全规则,避免无意义的补全
  • 若需保留lubridate原生时间对象(而非字符串),删除format()相关代码即可,后续可随时按需转换格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:55:27