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

Tibble时间跨度问题:按日汇总车辆记录时首末小时始终为0的排查

问题原因及修正方案

你的代码错误出在group_by步骤:你将date_loc重定义为lubridate::date(date_loc),这会把原字段的时间部分完全剥离,变成仅包含日期的类型。此时再用hour(date_loc)提取小时,得到的只能是默认的0点(因为纯日期类型的时间组件为00:00:00),所以count_start和count_last始终为0。

修正方案

你需要保留原始date_loc的完整时间信息来提取小时,分组时使用单独的日期列即可,以下是两种可行写法:

写法一:新增分组专用列

data_per_day <- data_per_hour %>%
  # 先按时间排序,确保first/last取到的是当天最早/最晚记录(如果数据未排序的话)
  arrange(date_loc) %>%
  group_by(group_date = lubridate::date(date_loc)) %>% 
  summarise(sum_cars = sum(car),
            # 取当天第一条记录的小时
            count_start = hour(first(date_loc)),
            # 取当天最后一条记录的小时
            count_last = hour(last(date_loc)),
            year_day = yday(first(date_loc)))

写法二:直接用日期表达式分组(不新增列)

data_per_day <- data_per_hour %>%
  arrange(date_loc) %>%
  group_by(lubridate::date(date_loc)) %>% 
  summarise(sum_cars = sum(car),
            count_start = hour(first(date_loc)),
            count_last = hour(last(date_loc)),
            year_day = yday(first(date_loc)))

补充说明

你原本用min(hour(date_loc))和max(hour(date_loc))的思路存在隐患:如果当天存在小时记录缺失(比如没有0点数据,但有1点和23点),这个写法结果是对的,但如果数据未按时间排序,min/max无法保证对应当天第一条和最后一条记录的小时。用first()和last()配合提前排序,能更准确地获取当天首尾记录的小时数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:33:09