【问题标题】:How to count the number of days, weeks, months in a date column of a dataframe in r?如何计算r中数据框的日期列中的天数、周数、月数?
【发布时间】:2020-08-12 20:57:51
【问题描述】:

使用format()我可以提取年月日如下:

date        day       month     year
<date>      <fctr>    <fctr>    <fctr>
    
2005-01-01  01        01        2005    
2005-01-01  01        01        2005    
2005-01-02  02        01        2005    
2005-01-02  02        01        2005    
2005-01-03  03        01        2005    
2005-01-03  03        01        2005    
...

2010-12-31  31        12        2010    
2010-12-31  31        12        2010    
2010-12-31  31        12        2010    
2010-12-31  31        12        2010    
2010-12-31  31        12        2010
2010-12-31  31        12        2010

但是,我也想计算从开始到结束有多少天、几周、几个月。也就是说,我想按如下方式创建日、周、月数字:

date        day       month     year     day_num    week_num    month_num
<date>      <fctr>    <fctr>    <fctr>   <double>   <double>    <double>
    
2005-01-01  01        01        2005     1          1           1
2005-01-01  01        01        2005     1          1           1
2005-01-02  02        01        2005     2          1           1
2005-01-02  02        01        2005     2          1           1
2005-01-03  03        01        2005     3          1           1
2005-01-03  03        01        2005     3          1           1
...

2005-02-28  28        02        2005     59         9           2
2005-03-01  01        03        2005     60         9           3
2005-03-02  02        03        2005     61         9           3
...

我怎样才能做到不误算?

【问题讨论】:

  • 不是month_num,只是as.numeric(as.character(month)),也许format(date, '%W')代表week_num,match(date, unique(date))代表`day_num
  • 没有。在月份列中,“01”代表“一月”,同样,“02”代表“二月”,依此类推。但是通过month_num,我想查看我的数据从头到尾有多少个月,并将此信息添加为单独的列
  • 好的,可能是您的示例不清楚,因为 'month' 和 'month_num' 显示除了类型之外的相同输出
  • day_num 和 week_num 那就更清楚了。这三个变量的计算思路其实是一样的

标签: r date datetime


【解决方案1】:

您可以使用difftime 来获取天数和周数,但您需要一个解决方法来计算月数。这样就可以了:

library(lubridate)
library(dplyr)

df %>% 
  mutate(
    day_num = as.numeric(difftime(date, min(date), units = "days")),
    week_num = floor(as.numeric(difftime(date, min(date), units = "weeks"))),
    tmp = year(date) * 12 + month(date),
    month_num = tmp - min(tmp)
  ) %>% 
  select(-tmp)

【讨论】:

  • 是的,它每年都会单独计算它,但它不应该在一年结束时从头开始,然后继续下一个。我的意思是如下。 2005-01-01;日:1,周:0,月:1。对于2005-12-31;日:365,周:52,月:12,但为 2006-01-01;日:1,周:0,月:1 再次,但我希望它继续,即 2006-01-01;日:366,周:53,月:13,2006-12-31 类似;日:730,周:104,月:24
【解决方案2】:

format() 与以下代码一起使用:

date = strptime('2005-02-28', format='%Y-%m-%d')

format(date, '%j') # Decimal day of the year

format(date, '%U') # Decimal week of the year (starting on Sunday)

format(date, '%W') # Decimal week of the year (starting on Monday)

format(date, '%m') # Decimal month

输出:

[1] "059"
[1] "09"
[1] "09"
[1] "02"

Source

【讨论】:

  • 这样更简单!
  • 是的,它每年都会单独计算它,但它不应该在一年结束时从头开始,然后继续下一个。我的意思是如下。 for 2005-01-01; day: 1, week: 0, month: 1. for 2005-12-31; day: 365, week: 52, month: 12,但又是for 2006-01-01; day: 1, week: 0, month: 1,但我希望它继续,即for 2006-01-01; day: 366, week: 53, month: 13 和类似的for 2006-12-31; day: 730, week: 104, month:24
猜你喜欢
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2015-05-05
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多