如何解释H2O的时间数据类型?

时间:2016-10-27 04:06:59

标签: r h2o

我在R中有一个数据框,我使用as.h2o()传递给H2O。

dataset.h2o <- as.h2o(dataset,destination_frame = "dataset.h2o")

对数据框执行str(),我们可以看到week_of_date类的数据类型为Date

  

$ primary_account_id:int 31 31 31 31 31 31 31 31 31 31 ...

     

$ week_of_date:日期,格式:“2015-08-31”“2015-09-07”“2015-09-14”“2015-09-21”......

然而,当在H2O Flow中查看时,它似乎被转换为名为time的数据类型 - 格式为

week_of_date time 0 0 0 0 1440943200000.0 1447592400000.0 1444480409625.8884 2013362534.5706

当我使用as.data.frame

将数据恢复到R时
returned.dataset <- as.data.frame(dataset.h2o)

它以我无法理解的格式存储,因此解析

  

$ primary_account_id:int 31 31 698 1060 1060 1060 1060 1060 1060 1133 ...

     

$ week_of_date:Class'POSIXct'num [1:194] 1442757600000 1446382800000 1446382800000 1442152800000 1442757600000 ...

请您指点我如何在R和H2O之间实现更好的互操作性?

谢谢!

4 个答案:

答案 0 :(得分:1)

这是h2o中的一个错误。 H2o以毫秒为单位返回日期时间,而R则为秒。见jira issue 3434

在此期间你可以做的是重新编码日期列: as.Date(structure(returned.dataset$week_of_date/1000, class = c("POSIXct", "POSIXt")))

答案 1 :(得分:0)

请参阅phiver的回复以获得更详细的答案,但另一个简单的解决方法是在传递给H2O之前将日期列转换为字符(如果您不需要H2O中日期格式的列)。这是一个简单的例子。

# construct a sample df with a date format column
df <- data.frame(week_of_date = as.Date(c('2015-09-29','2015-10-05')))
str(df$week_of_date)
Date[1:2], format: "2015-09-29" "2015-10-05"

# convert the column to H2O
df$week_of_date <- as.character(df$week_of_date)
str(df$week_of_date)
chr [1:2] "2015-09-29" "2015-10-05"

# convert to H2OFRAME and pass back to R data.frame and re-convert to date
df.hex <- as.h2o(df)
df2 <- as.data.frame(df.hex)
df2$week_of_date <- as.Date(df2$week_of_date)
str(df2$week_of_date)
Date[1:2], format: "2015-09-29" "2015-10-05"

答案 2 :(得分:0)

以上两个答案都很棒。但是,我认为更有效的解决方法是将数据集传递给h2o(不包括日期列)。然后,当您训练模型并进行预测时,这些字段/行的数量将与原始数据集的字段/行数量相同,您只需将“日期”列附加到预测矢量或矩阵即可。

当然,此解决方案中的预测与回测期间有关。

答案 3 :(得分:0)

如果日期时间列的格式正确,则转换为H2o并返回很容易。 (以毫秒为单位的时间精度会丢失)。如H20 FAQ

中所述
  

H2O设置为自动检测两种主要的日期/时间格式。首先   格式适用于格式为yyyy-MM-dd的日期。 ...第二次约会   格式用于格式为dd-MMM-yy的日期。

     

时间指定为HH:mm:ss。 HH是两位数的小时,必须是   值介于0-23(24小时制)或1-12(十二小时)之间   时钟)。 mm是两位数的分钟值,并且必须是0-59之间的值。   ss是两位数的第二个值,并且必须是0-59之间的值。

示例

示例数据

dates <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92")
times <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26")
x <- paste(dates, times)
df <- data.frame(datetime = strptime(x, "%m/%d/%y %H:%M:%S"))
# > df
#              datetime
# 1 1992-02-27 23:03:20
# 2 1992-02-27 22:29:56
# 3 1992-01-14 01:03:30
# 4 1992-02-28 18:21:03
# 5 1992-02-01 16:56:26

将格式更改为H2o首选的格式

# Change format 
df$datetime <- format(df$datetime, format = "%Y-%m-%d %H:%M:%S")

#H2o format
h2o_df <- as.h2o(df)

# Convert back
back_df <- as.data.frame(h2o_df)

back_df
#              datetime
# 1 1992-02-27 23:03:20
# 2 1992-02-27 22:29:56
# 3 1992-01-14 01:03:30
# 4 1992-02-28 18:21:03
# 5 1992-02-01 16:56:26