我有列-月,并且有几个月,我需要找出该月中的天数。
考虑到leap年,我需要找到一个月中的天数,并且该月可以到2019年6月或当前月。该逻辑应应用于列。
MONTH no_of_days
Jan,2017
Feb,2017
Mar,2017
Apr,2017
May,2017
Jun,2017
Jul,2017
Aug,2017
Sep,2017
Oct,2017
Nov,2017
Dec,2017
structure(list(MONTH = structure(c(9L,7L,15L,1L,17L,13L, 11L,3L,23L,21L,19L,5L,10L,8L,16L,2L,18L,14L,12L, 4L,24L,22L,20L,6L),.Label = c(“ 2017年4月”,“ 2018年4月”,“ 2017年8月”, “ 2018年8月”,“ 2017年12月”,“ 2018年12月”,“ 2017年2月”,“ 2018年2月”,“ 2017年1月”, “ 2018年1月”,“ 2017年7月”,“ 2018年7月”,“ 2017年6月”,“ 2018年6月”,“ 2017年3月”, “ 2018年3月”,“ 2017年5月”,“ 2018年5月”,“ 2017年11月”,“ 2018年11月”,“ 2017年10月”, “ 2018年10月”,“ 2017年9月”,“ 2018年9月”),类=“ factor”)),类=“ data.frame”,row.names = c(NA, -24L))
答案 0 :(得分:2)
您需要先将MONTH
列移至Date
,然后使用here显示的任何函数来获取一个月中的天数。
as.Date(paste0(1, df$MONTH), "%d%b,%Y")
#[1] "2017-01-01" "2017-02-01" "2017-03-01" "2017-04-01" "2017-05-01" "2017-06-01"
# "2017-07-01" "2017-08-01" "2017-09-01" "2017-10-01" "2017-11-01" "2017-12-01"
Hmisc::monthDays(as.Date(paste0(1, df$MONTH), "%d%b,%Y"))
#[1] 31 28 31 30 31 30 31 31 30 31 30 31
数据
df <- structure(list(MONTH = structure(c(5L, 4L, 8L, 1L, 9L, 7L, 6L,
2L, 12L, 11L, 10L, 3L), .Label = c("Apr,2017", "Aug,2017", "Dec,2017",
"Feb,2017", "Jan,2017", "Jul,2017", "Jun,2017", "Mar,2017", "May,2017",
"Nov,2017", "Oct,2017", "Sep,2017"), class = "factor")), class =
"data.frame", row.names = c(NA, -12L))
答案 1 :(得分:1)
软件包lubridate
具有一个称为days_in_month()
的功能。因此,您可以先将MONTH
列转换为日期,然后使用days_in_month
:
library(lubridate)
library(zoo)
df <- structure(list(MONTH = structure(c(9L, 7L, 15L, 1L, 17L, 13L, 11L, 3L, 23L, 21L, 19L, 5L, 10L, 8L, 16L, 2L, 18L, 14L, 12L, 4L, 24L, 22L, 20L, 6L), .Label = c("Apr,2017", "Apr,2018", "Aug,2017", "Aug,2018", "Dec,2017", "Dec,2018", "Feb,2017", "Feb,2018", "Jan,2017", "Jan,2018", "Jul,2017", "Jul,2018", "Jun,2017", "Jun,2018", "Mar,2017", "Mar,2018", "May,2017", "May,2018", "Nov,2017", "Nov,2018", "Oct,2017", "Oct,2018", "Sep,2017", "Sep,2018"), class = "factor")), class = "data.frame", row.names = c(NA, -24L))
df$no_of_days <- days_in_month(as.Date(as.yearmon(df$MONTH, "%b,%Y")))
答案 2 :(得分:1)
您需要将MONTH
列缠绕到date
对象中,然后才能使用lubridate::days_in_month()
:
if (!require(lubridate)) install.packages('lubridate')
if (!require(dplyr)) install.packages('dplyr')
library(lubridate)
library(dplyr)
dat %>%
mutate(MONTH = paste("01", MONTH, sep = ",") %>% dmy(),
no_of_days = days_in_month(MONTH))
# A tibble: 12 x 2
MONTH no_of_days
<date> <int>
1 2017-01-01 31
2 2017-02-01 28
3 2017-03-01 31
4 2017-04-01 30
5 2017-05-01 31
6 2017-06-01 30
7 2017-07-01 31
8 2017-08-01 31
9 2017-09-01 30
10 2017-10-01 31
11 2017-11-01 30
12 2017-12-01 31