从非分隔数据中提取小时分钟

时间:2016-01-07 16:23:39

标签: r datetime

我的工具数据包含非分隔格式的小时和分钟(例如0, 30, 100, 130, ... 2300, 2300)。我想将列转换为R中的POSIX对象(例如,看起来像"2016-01-07 11:07:59 EST"的东西),我的第一步是从此列中提取小时和分钟数据。 (我也有相应的Julian日期和年份列。)

我被绊倒了因为小时和分钟没有分隔,我无法使用strptime功能。我使用Google和SO(使用SO上的Rdatatime标记)进行了搜索,但一直无法找到解决方案。我在SO上找到的所有示例(例如,herehere)都将小时和分钟分隔为0:30之类的内容。

这是我的MCVE:

hour <- c(0, 30, 100, 130, 1000, 1030, 2300, 2330)
year <- c(2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007)
day  <- c(2, 2, 2, 2, 2, 2, 2, 2)
strptime(hour, "%h%m")

那么,当我有非分隔数据时,如何提取小时和分钟?

4 个答案:

答案 0 :(得分:5)

您可以使用sprintf将前导0添加到少于4位的小时数:

strptime(sprintf("%04d", hour), "%H%M")

然后您可以将其转换为日期:

as.POSIXct(paste(year,day,sprintf("%04d", hour),sep="-"),format = '%Y-%j-%H%M')

答案 1 :(得分:4)

使用sprintf

as.POSIXct(sprintf("%d %d %04d", year, day, hour), "%Y %j %H%M", tz = "GMT")
#[1] "2007-01-02 00:00:00 GMT" "2007-01-02 00:30:00 GMT" "2007-01-02 01:00:00 GMT" "2007-01-02 01:30:00 GMT" "2007-01-02 10:00:00 GMT"
#[6] "2007-01-02 10:30:00 GMT" "2007-01-02 23:00:00 GMT" "2007-01-02 23:30:00 GMT"

请注意,julian天数是使用%j而不是%d指定的。

答案 2 :(得分:3)

一个可能的解决方案是用'string_'中的'str_pad'填充小时0,然后使用'strptime':

tmp <- stringr::str_pad(hour,4,"left","0")
strptime(tmp, "%H%M")

答案 3 :(得分:2)

试试这个:

hour <- c(0, 30, 100, 130, 1000, 1030, 2300, 2330)
year <- c(2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007)
day  <- c(2, 2, 2, 2, 2, 2, 2, 2)

mins <- substr(sprintf('%04d', hour), 3, 4)
hour <- substr(sprintf('%04d', hour), 1, 2)

as.POSIXct(paste(year, day, hour, mins, sep = ':'), format = '%Y:%d:%H:%M')

[1] "2007-01-02 00:00:00 EST" "2007-01-02 00:30:00 EST"
[3] "2007-01-02 01:00:00 EST" "2007-01-02 01:30:00 EST"
[5] "2007-01-02 10:00:00 EST" "2007-01-02 10:30:00 EST"
[7] "2007-01-02 23:00:00 EST" "2007-01-02 23:30:00 EST"