gpt4 book ai didi

r - 为什么 as.Date 在字符向量上速度很慢?

转载 作者:行者123 更新时间:2023-12-02 04:35:20 26 4
gpt4 key购买 nike

我开始在 R 中使用 data.table 包来提高代码的性能。我正在使用以下代码:

sp500 <- read.csv('../rawdata/GMTSP.csv')
days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")

# Using data.table to get the things much much faster
sp500 <- data.table(sp500, key="Date")
sp500 <- sp500[,Date:=as.Date(Date, "%m/%d/%Y")]
sp500 <- sp500[,Weekday:=factor(weekdays(sp500[,Date]), levels=days, ordered=T)]
sp500 <- sp500[,Year:=(as.POSIXlt(Date)$year+1900)]
sp500 <- sp500[,Month:=(as.POSIXlt(Date)$mon+1)]

我注意到,与创建工作日等的其他函数相比,as.Date 函数完成的转换非常慢。这是为什么?有没有更好/更快的解决方案,如何转换为日期格式? (如果你问我是否真的需要日期格式,可能是的,因为然后使用 ggplot2 来制作绘图,对于这种类型的数据来说,它就像一个魅力。)

更准确地说

> system.time(sp500 <- sp500[,Date:=as.Date(Date, "%m/%d/%Y")])
user system elapsed
92.603 0.289 93.014
> system.time(sp500 <- sp500[,Weekday:=factor(weekdays(sp500[,Date]), levels=days, ordered=T)])
user system elapsed
1.938 0.062 2.001
> system.time(sp500 <- sp500[,Year:=(as.POSIXlt(Date)$year+1900)])
user system elapsed
0.304 0.001 0.305

在 MacAir i5 上,观测值略少于 3000000 个。

最佳答案

正如其他人提到的,strptime(从字符转换为 POSIXlt)是这里的瓶颈。另一个简单的解决方案使用 lubridate 包及其 fast_strptime 方法。

这是我的数据的样子:

> tables()
NAME NROW MB COLS
[1,] pp 3,718,339 126 session_id,date,user_id,path,num_sessions
KEY
[1,] user_id,date
Total: 126MB

> pp[, 2]
date
1: 2013-09-25
2: 2013-09-25
3: 2013-09-25
4: 2013-09-25
5: 2013-09-25
---
3718335: 2013-09-25
3718336: 2013-09-25
3718337: 2013-09-25
3718338: 2013-10-11
3718339: 2013-10-11

> system.time(pp[, date := as.Date(fast_strptime(date, "%Y-%m-%d"))])
user system elapsed
0.315 0.026 0.344

比较:

> system.time(pp[, date := as.Date(date, "%Y-%m-%d")])
user system elapsed
108.193 0.399 108.844

速度快了约 316 倍!

关于r - 为什么 as.Date 在字符向量上速度很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com