使用as.POSIXlt进行日期操作

时间:2014-06-04 20:15:27

标签: r date posixlt

我想找到最近的星期天到今天。

我今天定义为:

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

任何想法??

4 个答案:

答案 0 :(得分:2)

另一种解决方案:通过调用eg。:

来恢复class属性
structure(ifelse(as.POSIXlt(dt)$wday <= 3, 
       dt - as.POSIXlt(dt)$wday, 
       dt + as.POSIXlt(dt)$wday), class="Date")

答案 1 :(得分:1)

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

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

代替。

答案 2 :(得分:1)

此处无需使用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

答案 3 :(得分:1)

1)试试这个:

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

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

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

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

2)请注意,(1)中答案的第二行可以按以下方式编写,首先计算最后一个星期日(dt-wday)并添加7以获得下个星期天如果是本周的那个星期三。

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

3)另一种表达方式是:

dt - wday + 7 * (wday > 3)