如何将R中生成的小时交通时序数据转为日×24小时格式?
如何将小时级时间序列交通数据转换为日期×24小时的宽格式?
我明白你想要把这份小时级的信号灯车流量xts数据,转换成每行对应一个日期、每列对应一天中24个小时的结构——这种格式非常适合分析每日的交通峰值模式。下面给你几种实用的实现方法:
方法1:用Tidyverse工具(推荐,代码简洁易读)
先把xts对象转换成普通的data.frame,提取出日期和小时信息,再用pivot_wider重塑成宽格式:
# 加载tidyr包 library(tidyr) # 将xts数据转换为带时间索引的data.frame df <- data.frame( DateTime = index(ts_data), Count = coredata(ts_data) ) # 提取纯日期和小时(格式为两位数字,比如00、01...23) df$Date <- as.Date(df$DateTime) df$Hour <- format(df$DateTime, "%H") # 重塑为日期×小时的宽格式 wide_traffic_df <- df %>% pivot_wider( id_cols = Date, # 行标识:日期 names_from = Hour, # 列名来源:小时 values_from = Count, # 填充值:车流量 names_prefix = "Hour_" # 列名前缀,让列名更清晰 )
运行后,wide_traffic_df的每行就是一个日期,列从Hour_00到Hour_23,对应当天每个小时的车流量。
方法2:Base R原生实现
如果不想加载额外包,可以用base R的reshape函数完成:
# 先转换为包含Date、Hour、Count的data.frame df <- data.frame( Date = as.Date(index(ts_data)), Hour = format(index(ts_data), "%H"), Count = coredata(ts_data) ) # 重塑为宽格式 wide_traffic_base <- reshape(df, idvar = "Date", timevar = "Hour", direction = "wide", sep = "_")
这种方法生成的列名是Count_00、Count_01,你可以根据需要修改列名。
方法3:直接操作xts对象
如果你想直接基于xts对象处理,可以按日期拆分后再组合成矩阵:
# 按日期拆分xts数据 daily_data <- split(ts_data, "days") # 将每日的24小时数据转为矩阵行,缺失小时用NA填充 wide_traffic_xts <- do.call(rbind, lapply(daily_data, function(day_data) { # 确保每个日期都有24个数据点,不足的补NA day_values <- coredata(day_data) if(length(day_values) < 24) { c(day_values, rep(NA, 24 - length(day_values))) } else { day_values } })) # 转换为data.frame并设置清晰的列名和行名 wide_traffic_xts <- as.data.frame(wide_traffic_xts) colnames(wide_traffic_xts) <- paste0("Hour_", sprintf("%02d", 0:23)) rownames(wide_traffic_xts) <- names(daily_data)
注意事项
- 要确保原始数据的时间序列是连续的小时数据,如果存在缺失的小时段,上面的代码会自动用
NA填充,保证每行都是24列的结构。 - 如果你需要处理缺失值,可以在重塑后用
na.fill()(xts包)或者tidyr::fill()来填充。
内容的提问来源于stack exchange,提问作者Jothi Prakash Anandan
相关产品推荐
相关产品推荐

