【问题标题】:Question for calculating the mean date only with month and day仅用月份和日期计算平均日期的问题
【发布时间】:2021-02-12 15:47:08
【问题描述】:

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

【问题讨论】:

  • 您能否在这个问题中使用“dput()”和您的预期结果分享您的数据集?

标签: r date mean


【解决方案1】:

您无法计算一年中的“平均月+日”,因为并非每年都有相同的天数。所以你需要为你的计算选择一个固定的年份。

那么你可以:

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

【讨论】:

    【解决方案2】:

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

    代码如下:

        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
    

    【讨论】:

    • 我不认为使用一年中的一天更准确。如果有人对自年初以来平均过去了多少时间感兴趣,那么是的,这种方法是最好的。但是,如果您对平均日期感兴趣,它会遇到与直接使用日期相同的问题。但无论如何都是好主意! :)
    • @AEF 我可能想多了,但是为了稳健,您的方法要求您的“固定年份”是闰年,否则它无法处理 2 月 29 日的日期。但是,通过使用闰年,2 月之后的所有非闰日期在绝对值上都相差一天,因此您引入了系统性数据错误。我已经修改了我的代码以报告闰年和非闰年的月日,这可以识别年份类型之间的差异。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2015-06-20
    • 2021-08-19
    • 2016-06-07
    相关资源
    最近更新 更多