在R中从12小时转换为24小时并合并两个表

时间:2018-11-30 19:22:22

标签: r timestamp

Y表的图像

enter image description here

我想用键作为时间戳滚动连接两个表trial和trial2。一个表“ trial”的时间戳为 POSIXct 作为键,另一个表“ trial2”的时间戳为 character 。我试图将'trial2'timestamo从12小时格式转换为24小时格式(POSIXct),以便可以对它们应用滚动连接。但是,到目前为止,我使用过的任何东西在产生的test2字段rolli中都给了我NULL。

library(data.table)
library(dplyr)
library(lubridate)
library(readr)
library(hms)
trial <- read_csv("X.csv")
trial2 <- read_csv("Y.csv")
trial2$rolli<- as.POSIXct(trial2$date ,format = '%m/%d/%Y  %I:%M:%S %p')
#######OR#########
trial2$rolli<-strptime(trial2$date, "%m/%d/%Y  %I:%M:%S %p")
#######OR#########    
trial2$rolli<-ymd_hms(trial2$date)
trial<-mutate(trial, rolli=ymd_hms(paste("2018-11-27", Time), tz='Asia/Kolkata'))
trial<-data.table(trial)
trial2<-data.table(trial2)
setkey(trial, rolli)
setkey(trial2, rolli)
try<-trial[trial2, roll = "nearest"]

class(trial$rolli)
#[1] "POSIXct" "POSIXt"

class(trial2$rolli)
#[1] "POSIXct" "POSIXt"

1 个答案:

答案 0 :(得分:0)

调试总是很困难,因此有一个一般性提示:尝试尽可能减少调试。

看着它,我认为解析字符会带来问题。我不确定lubridate和ymd_hms,但是as.POSIXct和strptime调用应该可以工作。
您可以通过打印trial2 $ date和trial2 $ rolli进行检查。如果日期看起来不错,但rolli包含所有NA,则就是问题所在。

作为字符提供的日期可能格式不正确,这些功能可能会很挑剔。
为了确切知道出了什么问题,我需要看一下Y.csv的示例,但是您可以检查是否已正确输入所有内容:空格,或者是否已切换“ \”和“ /”?另外,我通常使用24小时表示法,因此strptime对于规范为“ am”或“ AM”或“ am.m”可能有些挑剔。或其他的东西。

编辑:我已经看到了您要提供的格式,该格式在几秒钟内具有小数位,这意味着%S不能解决问题。
相反,您需要%OS(它在?strptime的帮助中,但相当隐蔽)。另外,我在图像中看不到它,但是在您的原始代码中,“%Y”和“%I”之间有2个空格。您的输入中也有2个吗?

无论如何:

strptime('11/27/2018 11:44:04.479 AM', format='%m/%d/%Y %I:%M:%OS %p')
# Works with me
trial2$rolli<-strptime(trial2$date, "%m/%d/%Y %I:%M:%OS %p")
# Should solve your problem.

此外,当 printing trial2 $ rolli时,小数部分未显示,但被存储。您可以使用as.numeric(trial2$rolli) %% 1进行显示,尽管可能会有一些小的舍入差异。

第二次编辑: 要解决输入中有0:00 PM之类的问题(从技术上讲这是错误的,但您可能无法控制输入),可以使用:

trial2$date <- sub('0+(:..:..)', '12\1', trial2$date)

它将所有出现的形式0 :restoftime 或00 :restoftime 替换为12 :restoftime
仅注意您的来源在0:00:00.000 AM之类的含义是什么:这是午夜还是中午?我不知道R函数通常如何处理(或者即使保证始终相同),我也不会在这个问题上费力。如果您在互联网上浏览,那么很多人会对AM / PM在各种情况下的含义有很强烈的看法。