将每日气象周换算成标准气象周(R)。

问题描述 投票:1回答:2

我在SO中看到很多关于用以下方法将每日数据转换为每周数据的问题 xts, zoolubridate 包。没有一个答案适合我的问题。我尝试了以下代码

library(zoo)
library(lubridate)
library(xts)
library(tidyverse)

#Calculation for multistation
set.seed(123)
df <- data.frame("date"= seq(from = as.Date("1970-1-1"), to = as.Date("2000-12-31"), by = "day"),
                 "Station1" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 10, 30),
                 "Station2" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 11, 29),
                 "Station3" = runif(length(seq.Date(as.Date("1970-1-1"), as.Date("2000-12-31"), "days")), 9, 28))

head(df)

# Aggregate over week
df %>% 
  mutate(Week = week(ymd(date)),
         Year = year(ymd(date))) %>% 
  pivot_longer(-c(Week, date, Year), values_to = "value", names_to = "Station") %>% 
  group_by(Year, Week, Station) %>% 
  summarise(Weekly = mean(value)) %>% 
  arrange(Station) %>% 
  print(n = 55)

从输出中你可以看到1970年包含53周,而我不希望这样。我想从每年的第一个日期开始算起,如果是非闰年,第52周应该有8天,如果是闰年,第9周和第52周应该有8天,这样每年只包含52周。如何在R中做到这一点?

r tidyverse xts lubridate zoo
2个回答
2
投票

为什么不直接写一个根据你给的定义给出气象周的函数呢?包 lubridate 会给你一年的日子与 yday,它可以作为正确的周标签向量的索引。这些都可以通过简单的模块数学和连接来直接构建。

然后,你只需要计算出你是否处于闰年,这也是可以通过使用 lubridate::leap_year. 将这些结合在一起。ifelse 而且你有一个易于使用的功能。

met_week <- function(dates)
{
  normal_year <- c((0:363 %/% 7 + 1), 52)
  leap_year   <- c(normal_year[1:59], 9, normal_year[60:365])
  year_day    <- lubridate::yday(dates)

  return(ifelse(lubridate::leap_year(dates), leap_year[year_day], normal_year[year_day]))
}

你可以做

df %>% mutate(week = met_week(date))

2
投票

你可以直接在年月日手动操作,不知道是否已经有了这方面的功能。

df %>% 
  mutate(Week = pmin(52, ceiling(yday(date) / 7)),
         Year = year(ymd(date)))
© www.soinside.com 2019 - 2024. All rights reserved.