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

如何用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_1Site_2Year
152015
392015
272015
532015
062015

运行代码后得到:

Site_1Site_2Yeardate
15201501-01-2015 00:00
39201501-01-2015 01:00
27201501-01-2015 02:00
53201501-01-2015 03:00
06201501-01-2015 04:00

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:30:44