如何用R语言(优先tidyverse)为小时级时序数据集生成dmy_hm格式日期列
解决方案:用tidyverse生成连续小时时间列
你的数据集是按时间顺序排列的小时数据,从2015-01-01 00:00到2021-12-31 23:00,总61368行(正好覆盖7年的所有小时,含2016、2020两个闰年)。用tidyverse工具可以直接基于行号生成对应的时间列,无需手动处理闰年等复杂情况。
方法一:直接通过行号计算时间(推荐)
利用lubridate(tidyverse核心包之一)的时间运算功能,结合数据的行号生成对应时间,再格式化为dmy_hm样式:
library(tidyverse) # 假设你的数据集名为df df <- df %>% mutate( # 从起始时间开始,每行递增1小时,最后格式化为目标字符串格式 date = format( ymd_hm("2015-01-01 00:00") + hours(row_number() - 1), "%d-%m-%Y %H:%M" ) )
原理说明:
ymd_hm("2015-01-01 00:00")将起始时间转为POSIXct格式的时间对象hours(row_number() - 1)为每一行计算对应的小时偏移量(第一行偏移0小时,第二行1小时,以此类推)format(..., "%d-%m-%Y %H:%M")将生成的时间对象转为你需要的dmy_hm字符串格式
方法二:先生成完整时间序列再绑定
如果需要单独确认时间序列的完整性,可以先生成完整的小时序列,再和原数据绑定:
library(tidyverse) # 生成完整的小时时间序列 full_datetime <- seq( from = ymd_hm("2015-01-01 00:00"), to = ymd_hm("2021-12-31 23:00"), by = "hour" ) %>% format("%d-%m-%Y %H:%M") # 将时间列添加到原数据 df <- df %>% mutate(date = full_datetime)
为什么rep()容易失败?
你之前尝试的rep()方法需要手动计算每年的小时数(平年8760,闰年8784),还要按年份重复对应次数,不仅繁琐,还容易因为闰年计算错误导致序列长度不匹配,而上述方法直接基于时间规则生成序列,自动处理闰年,更可靠。
示例验证
用你提供的前5行数据测试:
原数据:
| Site_1 | Site_2 | Year |
|---|---|---|
| 1 | 5 | 2015 |
| 3 | 9 | 2015 |
| 2 | 7 | 2015 |
| 5 | 3 | 2015 |
| 0 | 6 | 2015 |
运行代码后得到:
| Site_1 | Site_2 | Year | date |
|---|---|---|---|
| 1 | 5 | 2015 | 01-01-2015 00:00 |
| 3 | 9 | 2015 | 01-01-2015 01:00 |
| 2 | 7 | 2015 | 01-01-2015 02:00 |
| 5 | 3 | 2015 | 01-01-2015 03:00 |
| 0 | 6 | 2015 | 01-01-2015 04:00 |
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

