R语言中使用as.Date想转变日期的形式 as.Date(x,format ("%Y%d%m")

Python015

R语言中使用as.Date想转变日期的形式 as.Date(x,format ("%Y%d%m"),第1张

在我们日常所遇到的数据分析任务中,会遇到很多与日期时间挂钩的数据,比如本月每日的销售额和网页一天内每个时间节点的点击量。这类型的数据大多数为时间序列,而时间序列分析在日常中也是很常见的。现在我们先来聊一下R语言中关于日期时间的处理,之后有时间的话就学习一些有关时间序列分析的方法。

一、日期函数as.Date()函数

R中自带的函数as.Date首先和大家介绍一下它的日常用法,第一个就是我们使用as.Date来返回日期数据形式,且默认的格式为年-月-日,format参数用于识别输入的日期按照那种数据逻辑输入,比如下面数据是以"*年*月*日"的逻辑输入:

>as.Date("2019年9月28日", format = "%Y年%m月%d日")

[1] "2019-09-28"

其中我们看到上面%Y等等的字符,其实是日期格式的一种字符形式,常用的格式如下:

第二个用法就是我们给定起点日期,再输入延后天数,就可以输出对应的日期:

>as.Date(31,origin ='2019-01-01')

[1] "2019-02-01"

二、时间函数POSIXct与POSIXlt

(1).POSIXIt主要特点:作用是打散时间,把时间分成年、月、日、时、分、秒,并进行存储我们可以结合unclass()函数,从而提取日期时间信息。比如:

>unclass(as.POSIXlt('2018-9-7 8:12:23'))

$sec

[1] 23

$min

[1] 12

$hour

[1] 8

$mday

[1] 7

$mon

[1] 8

$year

[1] 118

$wday

[1] 5

$yday

[1] 249

$isdst

[1] 0

$zone

[1] "CST"

$gmtoff

[1] NA

我们输入带时间的日期数据,利用unclass和as.POSIXlt函数就可以返回秒、分、时、日、该年已过月数、已过年数(从1900起)、星期几、该天对应该年的第几天,时区等等。

(2).POSIXct 是以1970年1月1号8点开始的以秒进行存储,如果是负数,则是之前的日期时间;正数则是之后,比如:

>unclass(as.POSIXct('1970-1-1 8:00:20'))

[1] 20

attr(,"tzone")

[1] ""

三、日期时间的运算

(1).日期相减,得到相差的天数

>as.Date("2019-10-01") - as.Date('2019-9-26')

Time difference of 5 days

(2).带时间的日期相减,得到相差数(可以指定units参数为"secs","mins","hours","days")

>difftime('2019-10-1 10:00:00',"2019-10-1 6:00:00",units="hours")

Time difference of 4 hours

用xlim或者ylim命令。比如:

# Specify axis options within plot()

plot(x, y, main="title", sub="subtitle",

xlab="X-axis label", ylab="y-axix label",

xlim=c(xmin, xmax), ylim=c(ymin, ymax))

对时序数据的研究包括两个基本问题:

在R中,一个数值型向量或数据框中的一列可通过 ts() 函数存储为时序对象

时间序列数据【存在季节性因素,如月度数据、季度数据等】可以被分解为趋势因子、季节性因子和随机因子

可以通过相加模型,也可以通过相乘模型来分解数据

对于乘法模型,可以取对数,将其转化为加性模型

那么如何将时间序列进行拆分,分解成这三部分呢?对于趋势和季节的分解,下面介绍移动平均和季节因子

时序数据集中通常有很显著的随机或误差成分。为了辨明数据中的规律,我们总是希望能够撇开这些波动,画出一条平滑曲线。画出平滑曲线的最简单办法是 简单移动平均 。比如每个数据点都可用这一点和其前后q个点的平均值来表示,这就是居中移动平均 centered moving average

St是时间点t的平滑值, k=2q+1 是每次用来平均的观测值的个数,一般我们会将其设为一个 奇数 。居中移动平均法的代价是,每个时序集中我们会损失最后的q个观测值,平均值消除了数据中的一些随机性

使用R语言 forecast 包中的 ma() 函数来对Nile时序数据进行平滑处理

从图像来看,随着k的增大,图像变得越来越平滑。因此我们需要找到最能画出数据中规律的k,避免过平滑或者欠平滑。这里并没有什么特别的科学理论来指导k的选取,我们只是需要先尝试多个不同的k,再决定一个最好的k

除此之外,还可以使用 加权移动平均 来进行平滑化

加权移动平均法的一大优势是它可以让趋势周期项的估计更平滑。观测值不是直接完全进入或离开计算,它们的权重缓步增加,然后缓步下降,让曲线更加平滑

季节指数的计算

将时序分解为趋势项、季节项和随机项的常用方法是用LOESS光滑做季节性分解。这可以通 过R中的 stl() 函数

stl函数只能处理相加模型,如果要处理相乘模型,可以使用log进行转换

[1] https://www.youtube.com/watch?v=2mM8BUqWAZ4

[2] https://zhuanlan.zhihu.com/p/21877990

[3] https://www.jianshu.com/p/e6d286132690

[4] https://nwfsc-timeseries.github.io/atsa-labs/sec-boxjenkins-stationarity.html

[6] Kabacoff, Robert. R 语言实战 . Ren min you dian chu ban she, 2016.