【问题标题】:Get the number of days from the date column [duplicate]从日期列中获取天数[重复]
【发布时间】:2019-06-11 07:11:07
【问题描述】:

我有列-月,还有几个月,我需要找出那个月的天数。

考虑到闰年,我需要找出一个月中的天数,并且该月可以到 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

结构(列表(月 = 结构(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 月")、class= "因子"))、class= "data.frame"、row.names = c(NA, -24L))

【问题讨论】:

  • 问题是找出一个月中有多少天还是编码问题?
  • 需要求一个月的天数,如何求,考虑闰年,月份可以到2019年6月,也可以是当月,逻辑应该放在列上。

标签: r


【解决方案1】:

您需要先获取MONTHDate 列,然后使用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))

【讨论】:

  • betterDates
  • @Robbystar 请检查答案。首先添加1,因为您没有日期组件,也请使用正确的格式,如图所示。做betterDates &lt;- as.Date(paste0(1, input$MONTH), format = "%d%b %Y ")
  • 试过它仍然得到所有 NA 的
  • class(input$MONTH) - 是因素
  • 你真的有你在这里展示的东西吗?我已经用我正在使用的数据更新了我的帖子。你能检查一下它与你拥有的数据有什么不同吗?如果有不同,请dput(input) 更新帖子。
【解决方案2】:

您需要将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

【讨论】:

  • betterDates
  • 但得到所有 NA 的
【解决方案3】:

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")))

【讨论】:

  • 您没有提供有效的答案。
  • 为什么不呢? OP 询问“考虑到闰年,我需要找出一个月中的天数,并且该月可以转到 2019 年 6 月或当月。逻辑应该应用于列。”我相信我已经回答了。
  • 如果你将df$no_of_days &lt;- days_in_month(df$MONTH) 插入 R 会发生什么?如果提问者不知道如何转换为日期格式怎么办?您的答案不完整且无效。
  • 按照这种逻辑,您还需要添加,然后他首先需要安装 lubridate 才能使您的示例正常运行?
  • @akrun,非常感谢,我已经进行了编辑。
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多