【问题标题】:R Increment Dates by Periods across data frame columnsR跨数据框列按期间递增日期
【发布时间】:2013-10-17 12:59:15
【问题描述】:

我正在尝试围绕测量时间段进行一些测试。我想增加测量箱的大小(即 1 个月与 2 个月等)。

我有一个带有日期 seq() 的数据框,它工作正常我的问题是将日期增加一个月、一周等。

df1 <- data.frame(id = 1:20, date1 = seq(as.Date('2012-01-01'),by = 'month', len = 20))
df1$date2 <- df1$date1 + 30

如果我想要每个月或每周的第一天,这显然是错误的。是否有针对此类问题的功能或包?

编辑:

这个:

seq( x, by = "month", length.out = 1)

似乎适用于单个单元格,但不适用于列,因为它返回数字:

df1$date2 <- sapply(df1$date1, function(x) seq( x, by = "month", length.out = 1))

> head(df1)
  id      date1 date2
1  1 2012-01-01 15340
2  2 2012-02-01 15371
3  3 2012-03-01 15400
4  4 2012-04-01 15431
5  5 2012-05-01 15461
6  6 2012-06-01 15492

【问题讨论】:

    标签: r date seq


    【解决方案1】:

    听起来你在找cut

    df1$date2 <- cut(df1$date1 + as.difftime(31, units='days'), breaks='months')
    df1$date3 <- cut(df1$date2 + as.difftime(1, units='weeks'), breaks='weeks')
    

    【讨论】:

    • 努力处理日期,A factor is returned, unless labels = FALSE which results in an integer vector of level codes. 引用帮助...解决方案:用as.Date 包裹整个事情?
    【解决方案2】:

    可能有更优雅的解决方案,但这应该可行 -

    df1$date2 <- as.Date(
       paste(
          ifelse(
             strftime(df1$date1,'%m') == 12,  
             as.integer(strftime(df1$date1,'%Y')) + 1,
             as.integer(strftime(df1$date1,'%Y'))
          ),
          ifelse(
             strftime(df1$date1,'%m') == 12,  
             1,
             as.integer(strftime(df1$date1,'%m')) + 1
          ),
          1,
          sep = "-"
       ),
    "%Y-%m-%d"
    )
    

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多