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

如何在R中将20分钟间隔的时序温度数据转为宽格式矩阵?

用R语言将时序温度数据转换为日期-时刻矩阵

问题背景

拥有2019年时序温度数据集,包含date(日期)、time(时刻)、tmpc(温度)三列,数据为每日20分钟间隔的观测值,示例数据如下:

date       time  tmpc
1. 2019-01-01 00:15 3.11
2. 2019-01-01 00:35 3.22
3. 2019-01-01 00:55 3.28
4. 2019-01-01 01:15 3.28
5. 2019-01-01 01:35 3.28
6. 2019-01-01 01:55 3.28

需要将其转换为**行对应日期(共365行)、列对应时刻(共72列)**的矩阵,温度值需准确匹配对应日期与时刻。当前尝试创建矩阵时,行名显示为数字而非预期的日期,且不清楚如何填充数据。

尝试的代码:

a = matrix (data= NA, nrow = 365, ncol = 72)
colnames(a) = c("00:15", "00:35", "00:55", "01:15", "01:35", "01:55",
      "02:15", "02:35", "02:55", "03:15", "03:35", "03:55",
       "04:15", "04:35", "04:55", "05:15", "05:35", "05:55",
       "06:15", "06:35", "06:55", "07:15", "07:35", "07:55",
       "08:15", "08:35", "08:55", "09:15", "09:35", "09:55",
       "10:15", "10:35", "10:55", "11:15", "11:35", "11:55",
       "12:15", "12:35", "12:55", "13:15", "13:35", "13:55",
       "14:15", "14:35", "14:55", "15:15", "15:35", "15:55",
       "16:15", "16:35", "16:55", "17:15", "17:35", "17:55",
       "18:15", "18:35", "18:55", "19:15", "19:35", "19:55",
       "20:15", "20:35", "20:55", "21:15", "21:35", "21:55",
       "22:15", "22:35", "22:55", "23:15", "23:35", "23:55")
rownames(a) = c(seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), by = "day"))    

解决方案

1. 解决行名显示为数字的问题

原代码中seq.Date()生成的是Date类型对象,直接赋值给矩阵行名时,R会自动将其转换为内部存储的数值(从1970-01-01开始的天数)。只需将Date对象转为字符型即可:

rownames(a) = as.character(seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), by = "day"))

2. 填充矩阵数据(基础R方法)

假设原始数据存储在名为df的数据框中,通过循环匹配日期和时刻,将温度值填入对应位置:

# 确保原始数据的date为Date类型,time为字符型
df$date <- as.Date(df$date)
df$time <- as.character(df$time)

# 遍历每一行数据,填充矩阵
for(i in 1:nrow(df)){
  # 找到对应日期的行索引
  row_idx <- which(rownames(a) == as.character(df$date[i]))
  # 找到对应时刻的列索引
  col_idx <- which(colnames(a) == df$time[i])
  # 赋值温度值
  a[row_idx, col_idx] <- df$tmpc[i]
}

3. 更高效的方法(使用tidyr包)

借助tidyverse生态中的tidyr::pivot_wider函数,可以更简洁地完成宽表转换,同时自动补全所有日期:

library(tidyverse)

# 预处理数据类型
df <- df %>%
  mutate(date = as.Date(date),
         time = as.character(time))

# 生成2019年所有日期
full_dates <- tibble(date = seq.Date(as.Date("2019-01-01"), as.Date("2019-12-31"), by = "day"))

# 转换为宽表并补全所有日期
wide_temp <- full_dates %>%
  left_join(df, by = "date") %>%
  pivot_wider(names_from = time, values_from = tmpc) %>%
  column_to_rownames(var = "date")

# 转换为矩阵
temp_matrix <- as.matrix(wide_temp)

此方法无需手动创建空矩阵,直接从原始数据转换得到目标矩阵,缺失的观测值会自动填充为NA。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:00:44