在有序的日期列表中填写缺失的年份

时间:2014-09-02 21:23:57

标签: r date date-arithmetic

我从网上收集了一些时间序列数据,我得到的时间戳如下所示。

24 Jun 
21 Mar
20 Jan 
10 Dec
20 Jun 
20 Jan
10 Dec 
...

有趣的是,数据中缺少年份,但是,所有记录都是有序的,您可以从记录中推断出年份并填写缺失的数据。因此,输入后的数据应该是这样的:

24 Jun 2014
21 Mar 2014
20 Jan 2014
10 Dec 2013 
20 Jun 2013
20 Jan 2013
10 Dec 2012
...

在抬起袖子并开始用for逻辑编写一个nested循环之前,有一种简单的方法可以在R中用于解决缺失的一年。

非常感谢任何建议!

2 个答案:

答案 0 :(得分:5)

这是一个想法

## Make data easily reproducible
df <- data.frame(day=c(24, 21, 20, 10, 20, 20, 10),
                 month = c("Jun", "Mar", "Jan", "Dec", "Jun", "Jan", "Dec"))


## Convert each month-day combo to its corresponding "julian date"
datestring <- paste("2012", match(df[[2]], month.abb), df[[1]], sep = "-")
date <- strptime(datestring, format = "%Y-%m-%d") 
julian <- as.integer(strftime(date, format = "%j"))

## Transitions between years occur wherever julian date increases between
## two observations
df$year <- 2014 - cumsum(diff(c(julian[1], julian))>0)

## Check that it worked
df
#   day month year
# 1  24   Jun 2014
# 2  21   Mar 2014
# 3  20   Jan 2014
# 4  10   Dec 2013
# 5  20   Jun 2013
# 6  20   Jan 2013
# 7  10   Dec 2012

答案 1 :(得分:0)

OP已要求从2014年开始以降序顺序完成这些年。

这是一种替代方法,无需日期转换和假日期。此外,这种方法可以修改为适用于与1月份不同的月份开始的财政年度。

# create sample dataset
df <- data.frame(
  day = c(24L, 21L, 20L, 10L, 20L, 20L, 21L, 10L, 30L, 10L, 10L, 7L),
  month = c("Jun", "Mar", "Jan", "Dec", "Jun", "Jan", "Jan", "Dec", "Jan", 
            "Jan", "Jan", "Jun"))

df$year <- 2014 - cumsum(c(0L, diff(100L*as.integer(
  factor(df$month, levels = month.abb)) + df$day) > 0))
df
   day month year
1   24   Jun 2014
2   21   Mar 2014
3   20   Jan 2014
4   10   Dec 2013
5   20   Jun 2013
6   20   Jan 2013
7   21   Jan 2012
8   10   Dec 2011
9   30   Jan 2011
10  10   Jan 2011
11  10   Jan 2011
12   7   Jun 2010

财政年度完成

让我们假设企业已决定在2月1日开始其会计年度。因此,1月份的财政年度与同一日历年份的2月或3月不同。

要处理会计年度,我们只需要相应地调整因子水平:

df$fy <- 2014 - cumsum(c(0L, diff(100L*as.integer(
  factor(df$month, levels = month.abb[c(2:12, 1)])) + df$day) > 0))
df
   day month year   fy
1   24   Jun 2014 2014
2   21   Mar 2014 2014
3   20   Jan 2014 2013
4   10   Dec 2013 2013
5   20   Jun 2013 2013
6   20   Jan 2013 2012
7   21   Jan 2012 2011
8   10   Dec 2011 2011
9   30   Jan 2011 2010
10  10   Jan 2011 2010
11  10   Jan 2011 2010
12   7   Jun 2010 2010