计算跨年的平均日期

Calculate mean date across years

我正在尝试为因子的每个级别计算独立于年份的平均日期。

DF <- data.frame(Date = seq(as.Date("2013-2-15"), by = "day", length.out = 730))
DF$ID = rep(c("AAA", "BBB", "CCC"), length.out = 730)
head(DF)

        Date  ID
1 2013-02-15 AAA
2 2013-02-16 BBB
3 2013-02-17 CCC
4 2013-02-18 AAA
5 2013-02-19 BBB
6 2013-02-20 CCC

利用上面的数据和下面的代码,我可以计算每个因素的平均日期,但这包括年份。

我想要跨年的平均月和日。首选结果是 POSIXct 时间 class 格式为月-日(例如 12-31 表示 12 月 31 日),代表多年的平均月和日。

library(dplyr)
DF2 <- DF %>% group_by(ID) %>% mutate(
    Col = mean(Date, na.rm = T))
DF2

加法 我正在为每个因素水平寻找一年中的平均日期,其中包含月份和日期部分。例如,如果日期表示动物繁殖的日期,我对年份之间的年度差异不感兴趣,而是想要一个平均日。

I 最终结果看起来像 DF2,但新值的计算方法如前所述(一年中的平均日,包含月日分量。

抱歉,这不是更清楚。

如果我没有正确理解你的问题,下面是获取平均日期列的方法。我首先使用 ydayPOSIXlt 中提取一年中的第几天。然后我计算 mean。要返回日期,我必须将这些日期添加到实际年份,因此创建了 Year 对象。根据要求,我在您的示例中以与 DF2 相同的格式放置结果。

library(dplyr)
DF2 <- DF %>%
mutate(Year=format(Date,"%Y"),
Date_day=as.POSIXlt(Date, origin = "1960-01-01")$yday)%>%
group_by(ID) %>%
mutate(Col = mean(Date_day, na.rm = T),Mean_date=format(as.Date(paste0(Year,"-01-01"))+Col,"%m-%d"))%>%
select(Date,ID,Mean_date)
DF2
> DF2
Source: local data frame [730 x 3]
Groups: ID [3]

         Date    ID Mean_date
       (date) (chr)     (chr)
1  2013-02-15   AAA     07-02
2  2013-02-16   BBB     07-02
3  2013-02-17   CCC     07-01
4  2013-02-18   AAA     07-02
5  2013-02-19   BBB     07-02
6  2013-02-20   CCC     07-01
7  2013-02-21   AAA     07-02
8  2013-02-22   BBB     07-02
9  2013-02-23   CCC     07-01
10 2013-02-24   AAA     07-02
..        ...   ...       ...

您可以使用 mean 函数获取日期的平均值。但是,请注意,平均实现(和结果) 会因数据类型 而异。对于 POSIXct,将计算平均值 return 日期 和时间 - 考虑取一堆整数的平均值,你可能会得到一个浮点数或数字。对于日期,它基本上 'round' 日期到最近的日期。

例如,我最近计算了日期的平均值。查看使用不同数据类型时的输出。

> mean(as.Date(stationPointDf$knockInDate))
[1] "2018-06-04"
> mean(as.POSIXct(stationPointDf$knockInDate))
[1] "2018-06-03 21:19:21 CDT"

如果我要寻找跨年的平均月和日,我会使用 lubridate 包将所有日期转换为当前年份。

library(lubridate)
year(myVectorOfDates) <- 2018

然后,我计算平均值并删除年份。