如何在R中将15分钟间隔的时间序列扩展为10秒间隔?
解决15分钟时间序列扩展为10秒间隔并批量填充的问题
问题背景
我有一个土壤湿度(SM)与温度(T)的时间序列数据集,原始数据时间间隔为15分钟,示例数据如下:
DateTime SMCount T1 T2 T3 2023-04-24 11:45:00 3960 12.875 15.625 17.5 2023-04-24 12:00:00 3951 13.00 15.375 17.125 2023-04-24 12:15:00 3955 13.25 15.6875 17.5 2023-04-24 12:30:00 3961 13.1875 14.75 15.875
需要将其扩展为10秒间隔的时间序列,每个原始时间点的SMCount、T1、T2、T3值在对应15分钟区间内重复填充,示例效果如下:
DateTime SMCount T1 T2 T3 2023-04-24 11:45:00 3960 12.875 15.625 17.5 2023-04-24 11:45:10 3960 12.875 15.625 17.5 2023-04-24 11:45:20 3960 12.875 15.625 17.5 2023-04-24 11:45:30 3960 12.875 15.625 17.5
现有代码的错误分析
尝试的两种方案均存在语法错误,核心问题是管道操作(%>%)的使用逻辑错误:
- 方案1错误:
complete()函数内不能直接用soilmoisture$DateTime = ...赋值,管道操作会自动传递上游数据,只需指定列名;同时by = 1未明确时间单位,应指定为秒。
library(tidyr) df <- complete(soilmoisture$DateTime = seq(from = min(soilmoisture$DateTime), to = max(soilmoisture$DateTime), by = 1)) %>% fill(SMCount)
报错:Error: unexpected '=' in "df %>% complete(soilmoisture$DateTime="
- 方案2错误:
mutate()函数内不能用soilmoisture$DateTime赋值,管道操作中直接使用列名即可;seq.POSIXt的步长设为"sec"是1秒,不符合10秒的需求,且存在拼写错误Datetime(应为DateTime)。
library(tidyverse) data <- mutate(soilmoisture$DateTime = lubridate::ymd_hms(soilmoisture$DateTime))%>% complete(soilmoisture$DateTime = seq.POSIXt(min(soilmoisture$Datetime), max(soilmoisture$DateTime), by="sec"))%>% fill(SMCount)
报错:Error: unexpected '=' in "data <- mutate(soilmoisture$DateTime ="
正确解决方案
以下是修复后的完整代码,可实现10秒间隔扩展及多列批量填充:
library(tidyverse) library(lubridate) # 确保DateTime列为POSIXct格式(如果原始数据不是的话) soilmoisture <- soilmoisture %>% mutate(DateTime = ymd_hms(DateTime)) # 扩展时间序列并批量填充所有需要重复的列 expanded_data <- soilmoisture %>% # 生成10秒间隔的时间序列,覆盖原始数据的时间范围 complete(DateTime = seq(from = min(DateTime), to = max(DateTime), by = "10 sec")) %>% # 批量填充SMCount、T1、T2、T3列,按向下填充(默认逻辑) fill(SMCount, T1, T2, T3, .direction = "down")
代码说明
- 格式转换:用
ymd_hms()将DateTime转换为POSIXct时间格式,确保时间序列操作正常执行。 - 时间扩展:
complete()函数直接指定DateTime列,生成步长为10秒的连续时间序列,管道会自动调用上游的soilmoisture数据。 - 批量填充:
fill()函数中列出所有需要填充的列,.direction = "down"表示从上到下填充,即每个原始时间点的值会填充到下一个原始时间点之前的所有10秒间隔行。
验证效果
运行代码后,expanded_data会包含10秒间隔的时间序列,每个15分钟区间内的SMCount、T1、T2、T3值与对应原始时间点的值完全一致,符合需求。
内容的提问来源于stack exchange,提问作者Steffi Carter
相关产品推荐
相关产品推荐

