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

