前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言:哪个函数解析时间最快?

R语言:哪个函数解析时间最快?

作者头像
用户7652506
发布于 2020-08-12 02:20:19
发布于 2020-08-12 02:20:19
1.5K0
举报

在前面

本期依旧由村长为大家供稿,主要讲述R语言在时间格式处理中的很多问题。

题提出

把“以字符格式存储”(chr)的时间日期数据解析成R中的时间日期(Date,POSIXct, POSIXlt...)格式是一项非常常见的工作。虽然有时候我们会发现有些任务不一定需要转换成日期格式就能完成,但是很多时候转化成日期格式是更安全的做法,而且会大大提高工作效率。

把字符形式的时间转换成专门的时间格式的优点有:

1

排序安全

例如我们有两个以字符存储的时间“2018-8-3”和“2018-12-2”,虽然“2018-8-3”显然比“2018-12-2”小,但是在R中如果运行"2018-8-3" < "2018-12-2",我们会得到FALSE。原因就在于后者的月份是“12”,他的第一个字符“1”要笔前者的“8”来的小。当然,如果我们日期严格按照ISO-8601标准,把所有空位都用0来补上,那么R的确能够得到正确的结果("2018-08-03" < "2018-12-02")。然而,谁能保证我们拿到的数据都是完美遵循ISO标准的呢?

2

速度快

一般来说,时间日期格式在R内部都是用整数来代表的,因为整数占用空间小,运算速度特别块。举个例子,如果用ASCII编码字符“2019-01-19”,里面有10个字符,每个字符占用8 bit,那么一共要用80 bit,但是在R的“Date”格式中,这个日期实际上用整数“17951”代表(R中的代码是:as.integer(as.Date('2019-01-19'))),该整数表示从1970-01-01开始所经过的天数。由于在R中整数只占用32 bit,很显然,用整数存储占用空间小。其次,很多运算都在底层对整数做了优化,因此处理起来要远远快于字符。

3

提供给你无穷可能

一旦把字符时间转换成特定的时间日期格式,那么我们就可能充分利用R中众多的时间日期函数。例如weekday(date),可以直接返回该日期对应星期几。我们甚至可以直接对日期进行运算,例如我们运行 as.Date('2019-01-10') - as.Date('2019-01-01'),其返回结果就是“Time difference of 9 days”。

那么现在问题来了,R中提供了许多函数来完成字符时间的解析,我们究竟应该用哪个好呢?具体而言,最常见的解析函数有 as.Date() (R自带), as.IDate() (data.table包),ymd() (lubridate包), fast_strptime() (lubridate包)。接下来我们就逐一测过来!

数测试

先来看以下我们的样例数据集:

非常简单,只有两列变量“id”和“date”,其中date是字符格式,从“0001-01-01”开始逐日递增一直到“2738-11-28”,共有100万行。我们选择这样一个大数是因为只有数据比较多的情况下不同函数运算时间的差别才会比较明显。

以下是生成样例数据集的代码,其中,生成的数据集叫做“dt”:

# 我们这里生成100万行日期数据。如果这个数字太小,可能不同函数的用时差别并不明显。

n <- 1e6

dt <- data.table(id = seq_len(n), date = seq(as.Date("0001-01-01"), len = n, by = "day") %>% as.character)

测试方法

我们使用“microbenchmark”这个包来完成测试。这个包很简单,只要输入你的代码,并且指定“times=N”,程序就会重复运行你的代码N次,然后返回运行时间的平均值。默认的话times=100,由于大猫比较懒,因此只设置了times=5.

测试结果

microbenchmark(dt[, .(id, date = as.Date(date))], times = 5) # 0.93 s

microbenchmark(dt[, .(id, date = as.IDate(date))], times = 5) # 0.93 s

microbenchmark(dt[, .(id, date = ymd(date))], times = 5) # 0.018 s

microbenchmark(dt[, .(id, date = fast_strptime(date, "%Y-%m-%d", lt = F) %>% as.IDate())], times = 5) # 0.006 s

# 结论:fast_strptime最快,但如果for less key stoke,推荐用ymd

很明显,来自lubridate包的fast_strptime同学遥遥领先,它的性能达到了R自带的as.Date函数的155x!同样来自lubirdate的ymd同学虽然稍逊一筹,但是仍然是as.Date的51x。不过,快也是有代价的,为了使用fast_strptime,我们必须手动指定需要解析的日期格式,在我们的例子中就是"%Y-%m-%d"。这些%是国际通用的表示时间日期的符号,有兴趣的小伙伴可以搜“ISO-8601标准”(懒人劝退)。

什么fast_strptime那么快?

因为fast_strptime是用C实现的,根据文档,

> fast_strptime() is a fast C parser of numeric formats only that accepts explicit format arguments, just as base::strptime().

fast_strptime最快,但如果想偷懒ymd似乎是一个很好的折中。

写在最后

实际上在lubridate包中,ymd并不是一个函数,而是一个家族,包括了ymd_hms(年月日_时分秒),mdy等多个变体。而且fast_strptime也有对应的变体,例如parse_date_time和parse_date_time2。不过这些变体所用的时间和其原型几乎没有差别,因此并没有放到本次测试中。

大猫的R语言课堂

我是大猫,一个高中读文科但却在代码、数学的路上狂奔不止的Finance Ph. D Candidate。

我是村长,一个玩了9年指弹吉他,却被代码深深吸引的博士候选人。

大猫的微信号是:

iRoss2007

村长的B站主页是:http://space.bilibili.com/40771572

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大猫的R语言课堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Mybatis传多个参数(三种解决方案)
其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。
似水的流年
2018/01/14
7170
SpringBoot 系列教程 Mybatis+xml 整合篇
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
一灰灰blog
2020/02/11
9590
SpringBoot 系列教程 Mybatis+xml 整合篇
Spring Boot从入门到精通-集成mybatis
在上一节中我们简单的使用了spring的JdbcTemplate来进行数据库操作,但是在实际的项目中使用mybatis来连接数据库是更好的选择。接下来我们将在项目中集成mybatis。 首先在pom.xml中加入mybatis的依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <vers
我的小熊不见了丶
2019/05/22
5990
Spring Boot从入门到精通-集成mybatis
SpringBoot使用Mybatis-Generator
Mybatis-Generator是Mybatis提供的一个便捷型插件,自动可以为项目生产对应的实体类,Mapper,dao层。
dalaoyang
2018/09/18
1.4K0
SpringBoot使用Mybatis-Generator
Spring boot Mybatis 整合(完整版)
7.项目不使用application.properties文件 而使用更加简洁的application.yml文件: 将原有的resource文件夹下的application.properties文件删除,创建一个新的application.yml配置文件, 文件的内容如下:
全栈程序员站长
2022/08/10
4850
Spring boot Mybatis 整合(完整版)
mybatis中collection association优化使用及多参数传递
注意:JsonIgnoreProperties请忽略,这是解决对象间循环依赖在json序列化时出错的,不在本次内容中
肖哥哥
2019/09/28
3.5K0
Spring Boot:实现MyBatis动态创建表
在有些应用场景中,我们会有需要动态创建和操作表的需求。比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等。这个时候就需要我们动态的生成和操作数据库表了。而我们都知道,以往我们使用MyBatis是需要提前生成包括Model,Mapper和XML映射文件的,显然因为动态生成和操作表的需求一开始表都是不存在的,所以也就不能直接通过MyBatis连接数据库来生成我们的数据访问层代码并用来访问数据库了。还好MyBatis提供了动态SQL,我们可以通过动态SQL,传入表名等信息然组装成建表和操作语句,接下来,我们就通过一个具体的案例来了解一下。
朝雨忆轻尘
2019/06/19
6.9K0
Spring Boot:实现MyBatis动态创建表
使用idea快速实现spring boot(1.5*版本) 与mybatis的整合
7.项目不使用application.properties文件 而使用更加简洁的application.yml文件: 将原有的resource文件夹下的application.properties文件删除,创建一个新的application.yml配置文件, 文件的内容如下:
凯哥Java
2019/06/30
3.2K0
SpringBoot教程(十一) | SpringBoot集成Mybatis
上一篇文章我们介绍了SpringBoot集成JdbcTemplate.简单体验了一下JdbcTemplate框架的用法,今天的内容比较重要,我们来介绍一下SpringBoot集成Mybatis的步骤。
一缕82年的清风
2022/04/08
7710
SpringBoot教程(十一) | SpringBoot集成Mybatis
Spring Boot Mybatis 搞反向工程,太方便咯。。
1.拷贝 Mybatis 反向工程配置文件到项目的根目录下 2. 根据项目及表的情况,修改 GeneratorMapper.xml 配置 如果使用 高版本 , 驱动类变为:com.mysql.cj
Java小咖秀
2021/02/20
3340
Spring Boot Mybatis 搞反向工程,太方便咯。。
关注微信公众号:Java技术栈,在后台回复:Mybatis,可以获取我整理的 N 篇 Mybatis 教程,都是干货。
Java技术栈
2020/11/23
7950
Spring Boot Mybatis 搞反向工程,太方便咯。。
mybatis逆向工程
就是我们可以根据数据库表,自动生成javabean,mapper接口和其对应的maaper.xml文件。
西西嘛呦
2020/08/26
5530
mybatis逆向工程
牛逼!在IDEA里搞Spring Boot Mybatis反向工程,太爽咯~
Java 的知识面非常广,面试问的涉及也非常广泛,重点包括:Java 基础、Java 并发,JVM、MySQL、数据结构、算法、Spring、微服务、MQ 等等,涉及的知识点何其庞大,所以我们在复习的时候也往往无从下手,今天小编给大家带来一套 Java 面试题,题库非常全面,包括 Java 基础、Java 集合、JVM、Java 并发、Spring全家桶、Redis、MySQL、Dubbo、Netty、MQ 等等,包含 Java 后端知识点 2000 +
程序员白楠楠
2020/11/27
4710
springboot之mybatis
Orm 框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句 Sql 的 Hibernate,一个是可以灵活调试动态 Sql 的 Mybatis ,两者各有特点,在企业级系统开发中可以根据需求灵活使用。发现一个有趣的现象:传统企业大都喜欢使用 Hibernate ,互联网行业通常使用 Mybatis 。
Vincent-yuan
2020/10/27
3730
SpringBoot集成mybatis配置
一个有趣的现象:传统企业大都喜欢使用hibernate,互联网行业通常使用mybatis;之所以出现这个问题感觉与对应的业务有关,比方说,互联网的业务更加的复杂,更加需要进行灵活性的处理,所以mybatis的灵活性特点更为适合其
小勇DW3
2018/09/29
2.5K0
从零开始做网站2-springboot整合mybatis
昨天把项目建好了,底子有了然后就是进行下一步开发了,先整合下Mybatis,使用Mybatis框架做数据持久化操作。
sunonzj
2022/06/21
2610
从零开始做网站2-springboot整合mybatis
mybatis配置文件模板(增删查改)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
用户1220053
2018/02/09
1.2K0
【Mybatis系列】Mybatis入门
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
框架师
2022/03/08
5880
【Mybatis系列】Mybatis入门
Spring+SpringMVC+Mybatis(开发必备技能)04、mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本、配套使用视频,100%运行成功
百度网盘链接:链接:https://pan.baidu.com/s/11cO4roAQ108D9E06IHrmGw 提取码:h63e
红目香薰
2022/11/30
3430
Spring+SpringMVC+Mybatis(开发必备技能)04、mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本、配套使用视频,100%运行成功
springboot(六):如何优雅的使用mybatis
这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis。到网上找了一下关于spring boot和mybatis组合的相关资料,各种各样的形式都有,看的人心累,结合了mybatis的官方demo和文档终于找到了最简的两种模式,花了一天时间总结后分享出来。 orm框架的本质是简化编程中操作数据库的编码,发展到现在基本上就剩两家了,一个是宣称可以不用写一句SQL的hibernate,一个是可以灵活调试动态sq
纯洁的微笑
2018/04/19
1.4K0
推荐阅读
相关推荐
Mybatis传多个参数(三种解决方案)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档