首页 > 解决方案 > 如何使用非每天采集的数据创建每日时间序列

问题描述

我有一个这样写的csv文件

Date        Data
1/5/1980    25
1/7/1980    30
2/13/1980   44
4/13/1980   50

我希望 R 产生这样的东西

Date        Date
1/1/1980    
1/2/1980
1/3/1980
1/4/1980
1/5/1980    25
1/6/1980 
1/7/1980    30

然后我希望 R 像这样将最后的观察结果向前推进

Date        Date
1/1/1980    
1/2/1980
1/3/1980
1/4/1980
1/5/1980    25
1/6/1980    25
1/7/1980    30

我想要两个单独的 data.tables 创建一个仅包含实际数据的表,然后创建另一个包含最后一个观察结果的表。

感谢所有的帮助!

编辑:我还需要将填充的任何 NA 更改为 0

标签: rdataframe

解决方案


你也可以使用tidyverse

library(tidyverse)

df %>%
  mutate(Date = as.Date(Date, "%m/%d/%Y")) %>%
  complete(Date = seq(as.Date(format(min(Date), "%Y-%m-01")), max(Date), by = "day")) %>%
  fill(Data) %>%
  replace(., is.na(.), 0)

前 10 行:

# A tibble: 104 x 2
   Date        Data
   <date>     <dbl>
 1 1980-01-01     0
 2 1980-01-02     0
 3 1980-01-03     0
 4 1980-01-04     0
 5 1980-01-05    25
 6 1980-01-06    25
 7 1980-01-07    30
 8 1980-01-08    30
 9 1980-01-09    30
10 1980-01-10    30

我以最小日期的月份和年份的第一天为起点,最大日期为最大值;这当然可以根据需要进行调整。

编辑:@Sotos 对更简洁的方法有更好的建议(通过更好地使用format参数):

df %>%
  mutate(Date = as.Date(Date, "%m/%d/%Y")) %>%
  complete(Date = seq(as.Date(format(min(Date), "%Y-%m-01")), max(Date), by = "day")) %>%
  fill(Data)

推荐阅读