R:用" YYYY-MM"选择日期时间子集条件

时间:2017-08-31 11:18:28

标签: r datetime subset dayofmonth

我的数据结构如下:

        curr      time
        <chr>   <date>
1       USD 2015-07-18
2       USD 2014-10-16
3       USD 2016-03-26

问题:

我喜欢选择整月

subset(ks, deadline >= '2010-01' & deadline <= '2016-03')

返回

Error in charToDate(x) : 
  character string is not in a standard unambiguous format.

这有效,但总是需要手动检查一个月的日子。

subset(ks, deadline >= '2010-01-01' & deadline <= '2016-03-31')

有没有办法获得第一个&#34;错误&#34;版本工作?

2 个答案:

答案 0 :(得分:1)

我这里只有很长的路要走!检查条件应分为3部分:

  1. 区间内所有月份的所有年份:例如。在我们的案例中,2010年至2015年将考虑所有月份。

  2. 去年:这里可能只有几个月。例如,从2016年开始,只考虑前3个月。同一个起始年份

    library(lubridate)
    log.cond <- (year(dt$time) %in% 2010:2015) | (year(dt$time) == 2016 & month(dt$time) %in% 1:3)
    subset(dt, log.cond)
    

答案 1 :(得分:0)

您的所有日期和截止日期似乎都是字符格式。最好的方法是使用日期格式(例如ymd包中非常有用的函数系列ymd_hmsyearmonthlubridate等但是如果他们是英语口语(第一年,然后是月,然后是一天,带有前导零),你实际上并不需要将它们变成日期到子集,你可以把所有内容保留为文本格式,切断最后一个3个字符(天)和R将进行数字比较:

ks = data.frame(curr="USD", "time"=c("2015-07-18", "2014-10-16", "2016-03-26"), stringsAsFactors = F)
ks$time2 <- substr(ks$time, 1, nchar(ks$time)-3)

然后您可以使用您的第一个语法而不做任何更改:

subset(ks, time2 >= '2015-01' & time2 <= '2016-03')
####   curr       time   time2
#### 1  USD 2015-07-18 2015-07
#### 3  USD 2016-03-26 2016-03