【问题标题】:Date manipulations using as.POSIXlt使用 as.POSIXlt 进行日期操作
【发布时间】:2014-07-25 15:41:19
【问题描述】:

我正在尝试查找距今天最近的星期日。

我将今天定义为:

dt <- as.Date("2014-06-04")

我可以通过以下方式找到最后一个星期日:

dt - as.POSIXlt(dt)$wday
[1] "2014-06-01"

我可以通过以下方式找到下周日:

dt + as.POSIXlt(dt)$wday
[1] "2014-06-07"

不知道为什么以下方法不起作用:

ifelse(as.POSIXlt(dt)$wday <= 3, 
       dt - as.POSIXlt(dt)$wday, 
       dt + as.POSIXlt(dt)$wday)
[1] 16222

我得到的是一个数字:16222,而不是日期。

以下每个语句都按预期工作:

as.POSIXlt(dt)$wday
class(as.POSIXlt(dt)$wday)
as.POSIXlt(dt)$wday <= 3

有什么想法吗??

【问题讨论】:

    标签: r date posixlt


    【解决方案1】:

    1)试试这个:

    wday <- as.POSIXlt(dt)$wday
    dt + ifelse(wday <= 3, -wday, 7-wday)
    

    这会将ifelse 应用于添加或减去的天数。 ifelse 适用于纯数字,但不适用于像 "Date" 类这样的复杂类型,因此这避免了将 ifelse 应用于 "Date" 类对象。

    请注意,如果 wday &gt; 3 那么我们要添加 7-wday 而不是 wday(如问题所示)。

    即使dt 是日期向量,此处的解决方案仍然有效。

    2) 请注意,(1) 中答案的第二行可以交替写成以下方式,首先计算最后一个星期日 (dt-wday),然后加 7 得到下一个星期日如果它是一周中的上一个星期三。

    dt - wday + ifelse(wday > 3, 7, 0)
    

    3) 另一种表达方式是:

    dt - wday + 7 * (wday > 3)
    

    【讨论】:

      【解决方案2】:

      这里不需要使用ifelse,经典的if/else 就可以了:

      if(as.POSIXlt(dt)$wday <= 3) dt - as.POSIXlt(dt)$wday else dt + as.POSIXlt(dt)$wday
      [1] "2014-06-01"
      

      甚至更简单:

      wday <- as.POSIXlt(dt)$wday 
      dt + if(wday<= 3) -wday else wday
      

      【讨论】:

      • +1 感谢您的工作。我有想过,但我的问题是要理解为什么ifelse 语句不起作用!!
      【解决方案3】:

      另一种解决方案:通过调用e.g.来恢复类属性:

      structure(ifelse(as.POSIXlt(dt)$wday <= 3, 
             dt - as.POSIXlt(dt)$wday, 
             dt + as.POSIXlt(dt)$wday), class="Date")
      

      【讨论】:

        【解决方案4】:

        ifelse 似乎返回一个向量并从您的日期中删除“POSIX”类。为什么不这样做

        dt + ifelse(as.POSIXlt(dt)$wday <= 3, -1, 1) * as.POSIXlt(dt)$wday
        

        改为。

        【讨论】:

        • 请注意,如果 dt 是周四、周五或周六,这个答案(以及除我之外的所有答案)会给出错误的结果。例如,对于 dt &lt;- as.Date("2014-06-05"),它给出的 as.Date("2014-06-09") 是星期一,不是星期天。 `
        猜你喜欢
        • 1970-01-01
        • 2014-12-24
        • 2015-09-14
        • 1970-01-01
        • 2020-12-09
        • 2013-10-03
        • 2012-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多