【问题标题】:Extract last time stamp of a day in R from 30 minute data从 30 分钟数据中提取 R 中一天的最后一个时间戳
【发布时间】:2016-09-10 02:03:27
【问题描述】:

我有一个以 30 分钟频率不规则采样的数据集,如下所示。我需要每天提取最后一个时间戳的索引。数据集如下:

datetime <-c("8/19/2011 16:00",
"8/19/2011 17:30",
"8/19/2011 18:30",
"8/19/2011 19:30",
"8/22/2011 4:00",
"8/22/2011 6:00",
"8/22/2011 7:00",
"8/22/2011 19:00",
"8/22/2011 19:30",
"8/23/2011 4:00",
"8/24/2011 5:30",
"8/24/2011 7:00",
"10/25/2011 7:30")

我已将其转换为 POSIXlt 对象,如下所示。

datetime <- strptime(datetime, format="%m/%d/%Y  %H:%M")
datetime <- as.POSIXlt(datetime)

但是,我无法提取每天的最后一个索引。我想要一个输出作为每天最后一个时间戳的索引,即我的输出将是

list of (4, 9, 10,12,13) corresponding to datetime values of 
"8/19/2011 19:30"
"8/22/2011 19:30"
"8/23/2011 4:00"
"8/24/2011 7:00"
"10/25/2011 7:30"

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 请修正代码中的错字。 datetime &lt;as.POSIXlt(datetime) 应该使用赋值运算符而不是小于运算符。此外,您想要的输出在 2011 年 8 月 23 日有两个最大值。
  • library(tidyverse) ; data_frame(datetime = mdy_hm(datetime)) %&gt;% rownames_to_column('index') %&gt;% group_by(date = date(datetime)) %&gt;% filter(datetime == max(datetime))

标签: r datetime posixlt


【解决方案1】:

将这些字符值转换为日期时间,然后按日期(日月)split。在每个日期内,使用which.max 选择最后一个值:

dt <- as.POSIXct(datetime, format="%m/%d/%Y %H:%M") 
lapply( split( dt, format(dt,"%m-%d") ), function(d) as.POSIXct(d[which.max(d)] ) )
$`08-19`
[1] "2011-08-19 19:30:00 PDT"

$`08-22`
[1] "2011-08-22 19:30:00 PDT"

$`08-23`
[1] "2011-08-23 07:30:00 PDT"

$`08-24`
[1] "2011-08-24 07:00:00 PDT"

【讨论】:

  • 这给了我一个错误 Error in which.max(d) : (list) object cannot be coerced to type 'double' 另外:警告消息:在 split.default(datetime, format(dt , "%m-%d")) : 数据长度不是分割变量的倍数
  • 如果您不首先转换为 R 日期时间值,您可能会收到错误,但我只是重新运行了该代码的 all 并且没有错误。
【解决方案2】:

试试:

数据:

 datetime <- c("8/19/2011 16:00", "8/19/2011 17:30", "8/19/2011 18:30", "8/19/2011 19:30", "8/22/2011 4:00", "8/22/2011 6:00", "8/22/2011 7:00", "8/22/2011 19:00", "8/22/2011 19:30", "8/23/2011 4:00", "8/24/2011 5:30", "8/24/2011 7:00", "8/23/2011 7:30", "12/23/2012 19:23", "11/24/2015 7:13")

代码:

splitter <- strftime(strptime(datetime,"%m/%d/%Y %H:%M"), "%m/%d/%Y")    
lapply(split(datetime, splitter), function(x) {
        match(x[length(x)], datetime)
    })

如果您还想返回索引处的值,您可以调整如下代码:

lapply(split(datetime, splitter), function(x) {
    val_index <- match(x[length(x)], datetime)
    c(val_index,datetime[val_index])
})

输出1:

$`08/19/2011`
[1] 4

$`08/22/2011`
[1] 9

$`08/23/2011`
[1] 13

$`08/24/2011`
[1] 12

$`11/24/2015`
[1] 15

$`12/23/2012`
[1] 14

输出2:

$`08/19/2011`
[1] "4"               "8/19/2011 19:30"

$`08/22/2011`
[1] "9"               "8/22/2011 19:30"

$`08/23/2011`
[1] "13"             "8/23/2011 7:30"

$`08/24/2011`
[1] "12"             "8/24/2011 7:00"

$`11/24/2015`
[1] "15"              "11/24/2015 7:13"

$`12/23/2012`
[1] "14"               "12/23/2012 19:23"

【讨论】:

  • 我想知道如果 datetime 是“10/22/2011 19:00”而不是“8/22/2011 19:00”,substr(datetime, 1,9) 是否会起作用。在那种情况下不应该是 substr(datetime, 1,10)。
  • 如果日期时间是什么?
  • 10/22/2011 19:00 而不是 9/22/2011 19:00,即 10,11 和 12 月。
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2021-06-01
  • 2020-08-09
相关资源
最近更新 更多