仅计算月份和日期的平均日期的问题

时间:2020-10-30 07:08:39

标签: r date mean

我有以下数据集,并且我希望获得年份中每个(物候学)现象和测站的平均日期(月和日)。看来我可以直接使用均值函数来计算日期格式对象的均值。但是,如果我使用功能as.Date将月份日期转换为日期,则会添加年份,并且平均日期与年份无关。如何仅根据月份和日期直接计算平均日期?

enter image description here

2 个答案:

答案 0 :(得分:0)

您不能计算年份的独立日,因为并非每年都有相同的天数。因此,您需要为计算选择固定的年份。

然后您可以:

  1. 创建具有正确月份和日期但先前选择的年份的“虚拟”日期对象。
  2. 计算这些假人的平均值
  3. 从结果中提取月份和日期(删除年份)

答案 1 :(得分:0)

您可以使用yday包中的lubridate函数将每个日期转换为该年的每年的日期,然后将每个Pheno的年的平均日期。将一年中的日期转换为一个月和一天取决于您要的日期是in年还是非leap年。我报告两个日期。

代码如下:

    library(tidyverse)
    library(lubridate)
#
#    calculate average day of year
#
    average_doy <- df  %>% mutate(day_of_year = yday(as.Date(paste(Year,Month,Day, sep="-")))) %>%
               group_by(Pheno) %>%
               summarize(avg_doy = round(mean(day_of_year,0))) 
 #   set base years
     non_leap_year <- 2003
     leap_year <- 2004
 #
 #   convert day of year to average day using base years 
 #
      averages <- average_doy %>% 
             mutate(avg_non_leap_year_mon_day = paste(avg_doy, non_leap_year, sep="_") %>% 
                                                as.Date(format = "%j_%Y") %>%
                                                str_remove(paste0(non_leap_year,"-")),
                    avg_leap_year_mon_day = paste(avg_doy, leap_year, sep="_") %>%
                                            as.Date(format = "%j_%Y") %>%  
                                            str_remove(paste0(leap_year,"-") ))
          

使用您数据的前七行,

# A tibble: 3 x 4
  Pheno         avg_doy avg_non_leap_year_mon_day avg_leap_year_mon_day
  <chr>           <dbl> <chr>                     <chr>                
1 Dormant           348 12-14                     12-13                
2 Tillering         343 12-09                     12-08                
3 Turning green      48 02-17                     02-17