【问题标题】:Create a timestamp quickly in data.table from date and time columns [duplicate]从日期和时间列在data.table中快速创建时间戳[重复]
【发布时间】:2017-02-15 15:21:39
【问题描述】:

我有一个包含 500 万行以上的数据集,我想从两列创建时间戳,一列带有日期,另一列带有时间值。

当我使用 fread() 函数将 csv 读入 R 时,所有列都是字符格式,因此我使用 data.table 将它们转换为相关格式,这对于这类事情来说非常快:

nf[, (dcols):= lapply(.SD,ymd),.SDcols=dcols] #using the ymd() function from lubridate to change date columns

我的下一步是创建一个时间戳,我按以下方式进行:

nf[,start_timestamp := as.POSIXct(paste(start_date,start_time))]

如果我围绕这个函数调用运行 Sys.Time(),我会得到 3.843 分钟的时间差。这需要等待一段时间,所以我想知道是否有人可以建议一个基于 data.table 的解决方案,让我能够更快地将这两列组合成一个时间戳?

【问题讨论】:

  • 你应该做一个可重现的例子:一些可用的数据作为nnc(行和列)的函数,以及适当的库调用。 Data.table 包括一些日期时间功能,但它涉及将日期和时间保存在单独的列中。见?IDateTime
  • this。我的猜测是as.POSIXct 是你的瓶颈。另外,我不确定你用ymd 做什么。
  • @DavidArenburg 我认为as.POSIXct 一定是瓶颈。我使用ymd 将日期格式从字符更改为日期 - 我发现它比as.Date 工作得更快。 @Frank - 我将创建一些示例数据并编辑原始帖子。
  • 你看我之前评论中的链接了吗?
  • 请不要那样做tt2 <- tt2:= 更新tt2 到位。另外,不用tt2 <- as.data.table(tt),只需执行setDT(tt) 并在tt 上操作。无需在环境中拥有相同数据集的相同副本。

标签: r data.table


【解决方案1】:

您可以使用fasttime 包中的fastPOSIXct 函数更快地创建时间戳

Sample data

library(data.table)
library(fasttime)
library(lubridate)

ttfile <- "timestamp_test_data.csv"

tt <- read.table(ttfile, header = TRUE, stringsAsFactors = FALSE, sep=",",na.strings=c("NA","N/A","null"))

dcols <- c('start_date','end_date')
tcols <- c('start_time','end_time')

setDT(tt) #convert to data.table

tt[, (dcols):= lapply(.SD,mdy),.SDcols=dcols] # := updates the data table in place, no need to pass it to another vector
tt[, (tcols):= lapply(.SD,as.ITime),.SDcols=tcols]

tt[,start_timestamp := fastPOSIXct(paste(start_date,start_time - 3600))] #remove number of seconds in an hour to fix fastPOSIXct adding an hour to the timestamp - if it doesn't do that for you, just remove that part
tt[,end_timestamp := fastPOSIXct(paste(end_date,end_time - 3600))]

str(tt)

【讨论】:

    猜你喜欢
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2021-03-11
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多