【问题标题】:R: Selecting datetime subset with "YYYY-MM" conditionR:选择具有“YYYY-MM”条件的日期时间子集
【发布时间】:2017-08-31 11:18:28
【问题描述】:

我的数据结构如下:

        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')

有没有办法让第一个“错误”版本正常工作?

【问题讨论】:

  • 您可以添加一个新列ks$time2 &lt;- strftime(ks$time, "%Y-%m"),然后将您的过滤器应用于该列。 subset(ks, time2 &gt;= "2010-01" &amp; time2 &lt;= "2016-03"
  • @count 我这里只有一个问题:strftime 返回一个character。那么将其保留为 strings 是否正确?只是想学习
  • @Fanny 嗨,如果任何答案解决了您的问题,您可以点击“接受”以便其他人看到吗?谢谢

标签: r datetime subset dayofmonth


【解决方案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)
    

【讨论】:

    【解决方案2】:

    您的所有日期和截止日期似乎都是字符格式。最好的方法是使用日期格式(例如 lubridate 包中非常有用的函数系列 ymdymd_hmsyearmonth 等)但如果它们是英语顺序(首先是年,然后是月,然后是日,前导零),您实际上不需要将它们转换为日期子集,您可以将所有内容保留为文本格式,剪切最后 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
    

    【讨论】:

    • 只是一个小修正 YYYY-MM-DD 格式是 ISO 8601 日期格式之一,ISO 8601 已被全球许多国家采用,但仍广泛使用本地日期格式。例如,在美国是主要的英语地区之一,格式 MM/DD/YYYY 是首选。
    • 这里建议的substr也可以替换成评论中建议的strptime
    猜你喜欢
    • 2012-02-14
    • 2021-01-01
    • 2017-07-20
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    相关资源
    最近更新 更多