如何为长时间数据帧创建一个以列为单位的时间和行为日期的矩阵?

问题描述

我是新来的,所以... 我有一个带有两个变量的数据框(R对我来说是新的,我长期使用Matlab)。一种是经典的POSIXlt,其时间戳在每个数据点之间间隔30分钟。第二个是数据本身(例如,空气温度数据)以及具有时间向量的相同维度。我用这对获得漂亮的地块。 我想以这种方式使用时间来重塑数据:我想使用列中的天数和行方向和时间(最多48列,使用0:00和23:30之间的30分钟间隔)对数据进行排序方向,以在另一个R包中使用此数据来填充丢失的数据。

>> head(data_f,10)
                  time  data
1  2013-08-01 00:30:00 8.001
2  2013-08-01 01:00:00 7.918
3  2013-08-01 01:30:00 7.621
4  2013-08-01 02:00:00 7.564
5  2013-08-01 02:30:00 7.718
6  2013-08-01 03:00:00 7.846
7  2013-08-01 03:30:00 7.481
8  2013-08-01 04:00:00 7.351
9  2013-08-01 04:30:00 7.275
10 2013-08-01 05:00:00 7.291

更多数据

48 2013-08-02 00:00:00  9.372
49 2013-08-02 00:30:00  9.485
50 2013-08-02 01:00:00  9.151
51 2013-08-02 01:30:00  8.870
52 2013-08-02 02:00:00  8.504
53 2013-08-02 02:30:00  8.404
54 2013-08-02 03:00:00  8.342
55 2013-08-02 03:30:00  8.278
56 2013-08-02 04:00:00  8.229
57 2013-08-02 04:30:00  8.163
58 2013-08-02 05:00:00  8.092
59 2013-08-02 05:30:00  8.038

我想要一个理想的矩形输出(可以是一个矩阵而不是一个数据帧),将NAs放在当时没有可用数据的地方。像这样:

           (30-min span in this direction -->)
2013-08-01   NA  8.001 7.918 7.621 7.564 7.718 7.846 7.481 7.351 7.275 7.291 ...
2013-08-02 9.372 9.485 9.151 8.870 8.504 8.404 8.342 8.278 8.229 8.092 8.038 ...
2013-08-03   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ... ...
2013-08-04   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ... ...
...
...

我已经尝试通过移植R解释日期和时间的方式来移植Matlab函数(为我自己写)来完成该任务,但没有成功。

更新:如何生成数据。 (考虑到原始数据来自我工作的7年数据库

library(lubridate)

data_f = data.frame(time = seq(from = as_datetime("2013-08-01 00:30:00"),to = as_datetime("2013-10-12 18:00:00"),by = "30 min"),data = runif(3491,2,14))

谢谢。

解决方法

您可能会采用的一种方法是分离日期和时间,然后重塑数据。以下是带有tidyverse函数的代码:

#Data
df <- structure(list(time = structure(c(1375317000,1375318800,1375320600,1375322400,1375324200,1375326000,1375327800,1375329600,1375331400,1375333200,1375401600,1375403400,1375405200,1375407000,1375408800,1375410600,1375412400,1375414200,1375416000,1375417800,1375419600,1375421400),class = c("POSIXct","POSIXt"),tzone = "GMT"),data = c(8.001,7.918,7.621,7.564,7.718,7.846,7.481,7.351,7.275,7.291,9.372,9.485,9.151,8.87,8.504,8.404,8.342,8.278,8.229,8.163,8.092,8.038)),class = "data.frame",row.names = c(NA,-22L))

代码:

#Split and reshape
df %>% separate(time,into = c('V1','V2'),sep = ' ') %>%
  pivot_wider(names_from = V2,values_from=data)

输出:

# A tibble: 2 x 13
  V1    `00:30:00` `00:59:59` `01:30:00` `02:00:00` `02:29:59` `03:00:00` `03:30:00` `03:59:59` `04:30:00`
  <chr>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1 2013~       8.00       7.92       7.62       7.56       7.72       7.85       7.48       7.35       7.28
2 2013~       9.48       9.15       8.87       8.50       8.40       8.34       8.28       8.23       8.16
# ... with 3 more variables: `05:00:00` <dbl>,`00:00:00` <dbl>,`05:29:59` <dbl>

由于新变量的名称可以更改,因此您可以重新排列它们。