【问题标题】:R: set a column of a dataframe as date-time in order to create intervalsR:将数据框的一列设置为日期时间以创建间隔
【发布时间】:2019-05-27 20:41:01
【问题描述】:

我有一个名为 data 的数据框,它在一列中包含日期时间信息,格式如下:mm/dd/yyyy hh:mm:ss am/pm

我想要的是创建 put timeperiod 值:1 小时内、2 小时内等。

我的数据框的几行:

        time                    timeperiod  refer x.x
1       05/07/2017 18:00:15         NA         1 23.97370
2       06/08/2017 06:21:12         NA         1 23.79394
3       06/08/2017 08:03:11         NA         1 23.79394
4       06/08/2017 08:12:47         NA         1 23.79394
5       07/07/2017 10:41:45         NA         1 23.54257
6      1/21/2017 8:10:20 AM         NA         1 21.06460
7      1/9/2013 10:01:32 PM         NA         2 23.99733
8      1/9/2013 10:01:32 PM         NA         2 23.99733
9      1/9/2013 10:01:32 PM         NA         2 21.06460
10     1/9/2013 10:01:32 PM         NA         2 21.06460

我试过了: strftime(data$time., format = "%m/%d/%y %H:%M:%S" %r) 但我收到以下错误:

as.POSIXlt.character(as.character(x), ...) 中的错误: 字符串不是标准的明确格式

【问题讨论】:

  • 试试cut(as.POSIXct(df1$time, "%m/%d/%Y %I:%M:%S %p"), "1 hour")
  • 对于前 5 个元素,AM/PM 是什么
  • 收到相同的错误:as.POSIXlt.character(as.character(x), ...) 中的错误:字符串不是标准的明确格式
  • akrun,我也注意到了,这些行是 24 小时格式的,我将它们更改为相同的格式 mm/dd/yyyy hh:mm:ss am/pm
  • 您必须指定两种不同的时间格式。 12 小时制格式的行(最后 5 行)应与 @akrun 的评论中一样,而 24 小时制的行需要%H 来指定小时而不是%I,并省略%p。您需要有条件地应用这两种不同格式中的一种

标签: r datetime


【解决方案1】:

一个选项是

i1 <- grepl("AM|PM", df1$time)
out <- as.POSIXct(rep(NA_real_, nrow(df1)), origin = "1970-01-01")
out[i1] <- as.POSIXct(df1$time[i1], format = "%m/%d/%Y %I:%M:%S %p")
out[!i1] <- as.POSIXct(df1$time[!i1], format = '%m/%d/%Y %H:%M:%S')
droplevels(cut(out, breaks = "1 hour"))
#[1] 2017-05-07 18:00:00 2017-06-08 06:00:00 2017-06-08 08:00:00 2017-06-08 08:00:00 2017-07-07 10:00:00 2017-01-21 08:00:00
#[7] 2013-01-09 22:00:00 2013-01-09 22:00:00 2013-01-09 22:00:00 2013-01-09 22:00:00
#Levels: 2013-01-09 22:00:00 2017-01-21 08:00:00 2017-05-07 18:00:00 2017-06-08 06:00:00 2017-06-08 08:00:00 2017-07-07 10:00:00

或者另一个选项是parse_date 来自parsedatefloor_date

library(lubridate)
library(parsedate)
floor_date(parse_date(df1$time), "hour")
#[1] "2017-05-07 18:00:00 UTC" "2017-06-08 06:00:00 UTC" "2017-06-08 08:00:00 UTC" "2017-06-08 08:00:00 UTC" "2017-07-07 10:00:00 UTC"
#[6] "2017-01-21 08:00:00 UTC" "2013-01-09 22:00:00 UTC" "2013-01-09 22:00:00 UTC" "2013-01-09 22:00:00 UTC" "2013-01-09 22:00:00 UTC"

数据

df1 <- structure(list(time = c("05/07/2017 18:00:15", "06/08/2017 06:21:12", 
"06/08/2017 08:03:11", "06/08/2017 08:12:47", "07/07/2017 10:41:45", 
"1/21/2017 8:10:20 AM", "1/9/2013 10:01:32 PM", "1/9/2013 10:01:32 PM", 
"1/9/2013 10:01:32 PM", "1/9/2013 10:01:32 PM"), timeperiod = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA), refer = c(1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L), x.x = c(23.9737, 23.79394, 23.79394, 
23.79394, 23.54257, 21.0646, 23.99733, 23.99733, 21.0646, 21.0646
)), class = "data.frame", row.names = c("1", "2", "3", "4", "5", 
"6", "7", "8", "9", "10"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多