计算跨年的平均日期
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
,但新值的计算方法如前所述(一年中的平均日,包含月日分量。
抱歉,这不是更清楚。
如果我没有正确理解你的问题,下面是获取平均日期列的方法。我首先使用 yday
从 POSIXlt
中提取一年中的第几天。然后我计算 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
然后,我计算平均值并删除年份。
我正在尝试为因子的每个级别计算独立于年份的平均日期。
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
,但新值的计算方法如前所述(一年中的平均日,包含月日分量。
抱歉,这不是更清楚。
如果我没有正确理解你的问题,下面是获取平均日期列的方法。我首先使用 yday
从 POSIXlt
中提取一年中的第几天。然后我计算 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
然后,我计算平均值并删除年份。