将时间序列重新排序为自定义的“准时间顺序”顺序

时间:2016-06-25 00:25:27

标签: r sorting time-series lubridate

我一直在寻找一种方法来按照自定义月订单(3月 - 2月)对时间序列进行排序,而不是按字母顺序排列,按时间顺序排列,按年份等。我想维持一年,我有大约60年的数据,所以我不能按月分类。我尝试过转换为因子和排序,但是没有用。以下是我的数据摘录:

    Date       GageFlow  Month
1 1955-10-01     0.00     10
2 1955-10-02     0.00     10
3 1955-10-03     0.00     10
4 1955-10-04     0.00     10

理想情况下,我希望时间序列从1956-03-01开始,并在从3月而不是10月开始的每一天,每月,每年中循环。换句话说,日期应该从1955年3月到1955年12月,然后是1955年1月到2月,然后是1956年3月至12月等... ...

2 个答案:

答案 0 :(得分:2)

您可以将模运算符%%与偏移量一起使用,将月份转换为自定义顺序。为了证明:

一些虚拟数据:

df <- data.frame(Date=seq(as.Date("1955/1/1"), as.Date("1956/12/31"), by = "day"))

现在安排自定义订单

library(dplyr)
library(lubridate)    
df <- arrange(df, year(Date), (month(Date)-3) %% 12)

注意,以上假设日期以升序&#34;标准&#34;开始。按时间顺序排列。如果在开始时未对行进行排序,则您还需要将该月的日期添加到arrange

df <- arrange(df, year(Date), (month(Date)-3) %% 12, day(Date))

答案 1 :(得分:1)

为了测试以下代码,我生成了一个带有2年数据的虚拟数据帧:

Date <- seq(as.Date("1955/1/1"), as.Date("1956/12/31"), by = "day")
GageFlow <- round(runif(731),2)
df <- data.frame(Date, GageFlow, stringsAsFactors = F)

head(df)
        Date GageFlow
1 1955-01-01     0.25
2 1955-01-02     0.51
3 1955-01-03     0.13
4 1955-01-04     0.46
5 1955-01-05     0.35
6 1955-01-06     0.20

以下代码根据March作为第一个月重新排列 而二月是最后一次。

library(lubridate)
library(dplyr)
# Create month variable
df$month <- month(df$Date)

# Create scaled month variable
df$month_new <- df$month - 2
df$month_new <- ifelse(df$month_new == -1 , 11, 
                       ifelse(df$month_new == 0, 12, df$month_new))

# Rearrange the dataframe    
df2 <- df %>% arrange(year(Date), month_new, day(Date)) %>% select(-month_new)

数据集现在具有以下配置:

head(df2)
        Date GageFlow month
1 1955-03-01     0.99     3
2 1955-03-02     0.98     3
3 1955-03-03     0.97     3
4 1955-03-04     0.60     3
5 1955-03-05     0.43     3
6 1955-03-06     0.28     3

进入12月到1月之间的过渡期:

df2[305:309,]
          Date GageFlow month
305 1955-12-30     0.91    12
306 1955-12-31     0.64    12
307 1955-01-01     0.25     1
308 1955-01-02     0.51     1
309 1955-01-03     0.13     1

进入次年2月至3月的过渡期:

df2[364:367,]
          Date GageFlow month
364 1955-02-27     0.46     2
365 1955-02-28     0.40     2
366 1956-03-01     0.81     3
367 1956-03-02     0.73     3