【问题标题】:Split a duration of an interval in calendar days以日历天为单位拆分间隔的持续时间
【发布时间】:2011-08-22 21:52:22
【问题描述】:

我有以下数据集,显示一集的开始和结束(日期和时间)

ep <- data.frame(start=c("2009-07-13 23:45:00", "2009-08-14 08:30:00", 
                         "2009-09-16 15:30:00"), 
                 end=c("2009-07-14 00:03:00", "2009-08-15 08:35:00", 
                       "2009-09-19 07:30:00"))

我需要将其转换为一个数据框,该数据框将显示每个日历日有多少分钟的剧集。对于上面的示例,它将是:

2009-07-13  15
2009-07-14  3
2009-08-14  930
2009-08-15  515
2009-09-16  510
2009-09-17  1440
2009-09-18  1440
2009-09-19  450

感谢您的帮助

【问题讨论】:

    标签: r time


    【解决方案1】:

    这可行,但似乎有点不雅。首先,创建一个向量,它是每个开始时间和结束时间之间的时间序列(以分钟为单位):

    tmp <- do.call(c, apply(ep, 1, 
                            function(x) head(seq(from = as.POSIXct(x[1]), 
                                                 to = as.POSIXct(x[2]),by = "mins"), 
                                             -1)))
    

    我们使用head(...., -1) 从每个序列中删除最后一分钟,以便分钟匹配您想要的。

    接下来,将此向量拆分为在各个日期发生的分钟,并计算每天有多少分钟:

    tmp <- sapply(split(tmp, format(tmp, format = "%Y-%m-%d")), length)
    

    请注意,由于某种原因(可能与时区相关),我们不能只使用 as.Date(tmp) 来获取日期向量,我们需要明确格式化时间以仅显示日期部分。

    最后一步是将包含我们需要的所有内容的 tmp 对象排列成您要求的格式:

    mins <- data.frame(Date = names(tmp), Minutes = tmp, row.names = NULL)
    

    这给出了:

    > mins
            Date Minutes
    1 2009-07-13      15
    2 2009-07-14       3
    3 2009-08-14     930
    4 2009-08-15     515
    5 2009-09-16     510
    6 2009-09-17    1440
    7 2009-09-18    1440
    8 2009-09-19     450
    

    【讨论】:

    • @ECII 不客气。请开始一个新的Q;你会更多地关注这个问题,而且它比 cmets 更容易处理。在新的 Q 中链接回这个(你的)Q。
    • Thanx。我设法通过一些铸造、熔化和重塑来获得它。尽管如此,您对秒数进行排序并按日期拆分的技巧是尊重!!!!!!。再次非常感谢。
    猜你喜欢
    • 2010-09-20
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2014-02-27
    • 2021-12-12
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多