我的工具数据包含非分隔格式的小时和分钟(例如0, 30, 100, 130, ... 2300, 2300
)。我想将列转换为R中的POSIX
对象(例如,看起来像"2016-01-07 11:07:59 EST"
的东西),我的第一步是从此列中提取小时和分钟数据。 (我也有相应的Julian日期和年份列。)
我被绊倒了因为小时和分钟没有分隔,我无法使用strptime
功能。我使用Google和SO(使用SO上的R
和datatime
标记)进行了搜索,但一直无法找到解决方案。我在SO上找到的所有示例(例如,here或here)都将小时和分钟分隔为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")
那么,当我有非分隔数据时,如何提取小时和分钟?
答案 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"