oracle与r语言时间转换,R语言 日期、时间和lubridate包

2、strptime()解析日期

函数strptime( )是string parse time的简称,返回POSIXlt日期(即以列表的形式存储日期和时间),在解析时必须制定文本和日期对应的位置,日期的格式使用%+字母来指定。strptime(x,format="",tz=""),参数tz是时区(time zone),默认是空,在解析时,如果不指定时区,R会调用Sys.timezone( ) 。常用的时间格式符号是:

%H:小时(24小时制)

%I:小时(12小时制)

%p:对于12小时制,指定上午(AM)或下午(PM)

%M:分钟

%S:秒

Sys.time() #返回现在的时间

strftime(x,"%y/%m/%d %H:%M:%S")  #把时间格式转换为字符串格式

strptime(x,"%y/%m/%d %H:%M:%S")   #把字符串格式转换为时间格式

> nowstr nowstr[1] "2020-11-04 20:13:18 CST"> nowstr nowstr[1] "20/11/04 20:13:18"> nowtime nowtime[1] "2020-11-04 20:13:18 CST"

3、format()

format()函数可以把默认的日期格式转换成自己指定的格式的日期值,还可以提取日期值的某一部分。format(x, format="output_format")第一个参数是日期值,第二个参数是指定的要输出的日期的格式或者想要提取的部分

> today  #把日期以非缩写月份/数字表示的日期/四位数的年份的格式输出> format(today, format="%B/%d/%Y")[1] "十一月/04/2020"> # 提取日期的非缩写星期名> format(today, format="%A")[1] "星期三"

4、计算时间间隔

1):R的内部在存储日期时,是使用1970年1月1日以来的天数表示的,更早的日期则表示为负数。这样两个日期值就可以相减,而所得到的的结果就是两个日期值相差的天数

> startdate enddate #显示两个日期间隔的天数> days daysTime difference of 366 days

2):difftime()用来计算两个日期值的时间间隔

,并可以以星期,天,时,分,表等方式来表示。difftime(x,y,units)第一个参数表示用来去减的数,第二个参数是被减数,第三个参数是时间间隔显示方式,units可以是"auto"、"secs"、"mins"、"hours"、"days"、"weeks"(默认days)。

> today dob difftime(today,dob)Time difference of 10397 days> difftime(today,dob,units="days")Time difference of 10397 days> difftime(today,dob,units="auto")Time difference of 10397 days> difftime(today,dob,units="secs")Time difference of 898300800 secs

将日期转换为字符型变量,使用as.character()将日期值转为字符型

> dates=c("2018-02-15","2019-03-15")> dates strDates str(strDates)chr [1:2] "2018-02-15" "2019-03-15"

3):由于POSIXct类是以秒为单位来计算时间,Date类是以天为单位类计算时间日期和POSIXct都是通过转换为天数或秒数的数值所以可以把他们当做数值进行加减

一种方式是两个日期值相互加减,第二种方式是日期值加减一个数值,Date类和POSIXct类不同混合加减两者的数值代表不同的含义。这意味着可以在日期值上执行比较运算符合算术运算:

将数字和Date类相加,增加或减少相应的天数

将数字和POSIXct类相加,增加或减少相应的秒数。时间与数字相加,时间以秒为单位

由于Date类和POSIXct类实际上都是一个整数,可以直接比较大小

> time1 print(time1)[1] "2020-11-04 20:38:49 CST"> print(time1 + 60*60) #增加了一个小时[1] "2020-11-04 21:38:49 CST"> #日期与数字相加,日期以天为单位:> date1 print(date1)[1] "2020-11-04"> print(date1 +1)[1] "2020-11-05"

四:lubridate包介绍

lubridate包使得日期和时间处理更加规范,简单和灵活。lubridate中所有解析函数都会返回POSIXct日期,默认都是用UTC时区。lubridate包主要有两类函数,一类是处理时点数据(time instants), 另一类是处理时段数据(time spans)

#安装和载入lubridate包install.packages("lubridate")library(lubridate)

系统的当前时间lubridate::now(),和Sys.time()函数返回的时间相同

系统的当前日期lubridate::today(),和Sys.Date()函数返回的日期相同;

> now()[1] "2020-11-04 20:47:55 CST">> today()[1] "2020-11-04"

lubridate从字符串转换为日期类型。ymd()函数用于从字符型数据解析时间,该函数会自动识别各种分隔符,函数的定义是:ymd(...,quiet = FALSE,tz=NULL)。参数注释

quiet:布尔型,当指定为TRUE时,移除文本中自定义的文本;tz: 时区,默认为NULL;ymd代表文本的格式必须依次是;year、month、day、除了ymd外还有ydm,mdy,myd,dmy,dym。

> x  x[1] "2010-04-09"> x[1] "2010-04-09"> str(x)Date[1:1], format: "2010-04-09"

抽取或设置时间部分。date:抽取或设置时间的日期,类似的还有year,month,day ,week,hour,minute,second

> x date(x)[1] "2010-04-09"> month(x)[1] 4> day(x)[1] 9

设置当前时间月份为6月

> x[1] "2020-11-04 20:54:08 CST"> month(x) x[1] "2020-06-04 20:54:08 CST"

为了处理时区信息,lubridate包提供了三个函数 :

tz: 提取数据数据的时区 tz(today())

with_tz:将时间数据转换为另一个时区的同一时间,时间值改变但是时间不变

force_tz;将时间数据的时区强制转换为另一个时区,时间值不变但是时间会变

> times > with_tz(times,tz="America/Chicago")[1] "2020-11-04 06:57:00 CST">> times[1] "2020-11-04 12:57:00 UTC"

时间的运算

lubridata还能创建两类对象:期间(Duration)和周期(Period),创建period的辅助函数是unit+s,创建duration的辅助函数是d+unit+s,unit是时间单位,常用的时间单位有:year、month、week、day、hour、minute和second。期间指定的时间跨度为秒的倍数,是固定的秒数。例如,一天的总时间是86 400秒(60 x 60 x 24),一年的总时间是86 400 x 365 (秒),期间类型把一年的天数固定为365天,没有考虑闰年。

周期period根据日历来指定时间阔度,这意味着,在把周期添加到一个时间之前,period的确切的时间跨度是不固定的。例如,一年的周期可以是365天,也可以是366天,这取决于它是否是闰年。时间和日期的算术运算,跟期间和周期有关系,经常用到的是周期period类型。

常用的duration类的函数有:duration(num = NULL, units = "seconds", ...)

is.duration(x)

dseconds(x = 1)

dminutes(x = 1)

dhours(x = 1)

ddays(x = 1)

dweeks(x = 1)

dyears(x = 1)

> x x + ddays(1) + dhours(6) + dminutes(30)[1] "2009-08-04 06:30:00 CDT"> x + ddays(100) - dhours(8)[1] "2009-11-10 15:00:00 CST"

常用的period类的函数有:period(num = NULL, units = "second", ...)

is.period(x)

seconds(x = 1)

minutes(x = 1)

hours(x = 1)

days(x = 1)

weeks(x = 1)

years(x = 1)

months(x)

#对时间加上期间和周期,返回的结果是不同的:ymd(20120101) + dyears(1)

> ymd(20120101) + years(1)[1] "2013-01-01"> ymd(20120101) + months(1)[1] "2012-02-01"> ymd(20120101) + days(1)[1] "2012-01-02"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值