我一直在寻找一种方法来按照自定义月订单(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月等... ...
答案 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