首页 > 解决方案 > 如何为长时间数据框创建列中时间和行中日期的矩阵?

问题描述

我是新来的,所以...我有一个带有两个变量的数据框(R 对我来说是新的,我使用 Matlab 很长时间了)。一个是经典的 POSIXlt,每个数据点之间的时间戳为 30 分钟。第二个是数据本身(例如,气温数据)和与时间向量相同的维度。我用这对来获得漂亮的情节。我想以这种方式使用时间重塑数据:我想使用行方向的天数和列中的时间(最多 48 列,使用 0:00 和 23:30 之间的 30 分钟间隔)对数据进行排序-direction,在另一个 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   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ... ...
...
...

我一直在移植一个 Matlab 函数(为我自己编写)来实现这一点,但没有成功,顺便说一下 R 解释日期和时间的方式。

更新:如何生成数据。(考虑到原始数据来自我工作的 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))

提前致谢。

标签: rtime-seriesreshape

解决方案


您可以采用的一种方法是分离日期和时间,然后重新调整数据。这里有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>

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


推荐阅读