
R語言與格式、日期格式、格式轉(zhuǎn)化
R語言的基礎包中提供了兩種類型的時間數(shù)據(jù),一類是Date日期數(shù)據(jù),它不包括時間和時區(qū)信息,另一類是POSIXct/POSIXlt類型數(shù)據(jù),其中包括了日期、時間和時區(qū)信息。基本總結(jié)如下:
日期data,存儲的是天;
時間POSIXct 存儲的是秒,POSIXlt 打散,年月日不同;
日期-時間=不可運算。
一般來講,R語言中建立時序數(shù)據(jù)是通過字符型轉(zhuǎn)化而來,但由于時序數(shù)據(jù)形式多樣,而且R中存貯格式也是五花八門,例如Date/ts/xts/zoo/tis/fts等等。lubridate包(后續(xù)有介紹,應用四),timeDate包,都有用。
常見的格式:
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
d<-as.character(z) #將數(shù)值向量z<-(0:9)轉(zhuǎn)化為字符向量c("0", "1", "2", ..., "9")。
as.integer(d) #將d轉(zhuǎn)化為數(shù)值向量
e <- numeric() #產(chǎn)生一個numeric型的空向量e
a=data.frame(a) #變成R的數(shù)據(jù)框
factor() #變成因子 可以用levels()來看因子個數(shù)
在data.frame中,是可以實現(xiàn)數(shù)據(jù)集重命名的,比如data.frame(x=iris,y=cars),
也可以實現(xiàn)橫向、縱向重命名,data.frame(x=iris,y=cars,row.names=iris)
——————————————————————————————————————————
后續(xù)加更內(nèi)容
應用1——如何通過生日計算年齡
應用2——日期分組
應用三——生成按天的時間序列并進行回歸
應用四:靈活處理時間數(shù)據(jù)—lubridate包(來源TipDM)
應用五:如何在循環(huán)、函數(shù)中,輸出實時時間消耗?
——————————————————————————————————————————
時間的標準格式
mydate = as.POSIXlt(’2005-4-19 7:01:00’)
names(mydate)
默認情況下,日期之前是以/或者-進行分隔,而時間則以:進行分隔;
輸入的標準格式為:日期 時間(日期與時間中間有空隔隔開)
時間的標準格式為:時:分 或者 時:分:秒;
如果輸入的格式不是標準格式,則同樣需要使用strptime函數(shù),利用format來進行指定。
——————————————————————————————————————————
一、日期型數(shù)據(jù)——data
1、as.Data函數(shù)
在R中自帶的日期形式為:as.Date();以數(shù)值形式存儲;
對于規(guī)則的格式,則不需要用format指定格式;如果輸入的格式不規(guī)則,可以通過format指定的格式讀入;其中以1970-01-01定義為第0天,之后的年份會以距離這天來計算。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> x<-as.Date("1970-01-01")
> unclass(x)
[1] 0
>
> unclass(as.Date("1970-02-01")) #19700201代表第31天
[1] 31
代碼解讀:unclass可以將日期變成以天來計數(shù),比如1970-02-01輸出的31,就代表著距離1970-01-01有31天。
as.data中的參數(shù)格式:年-月-日或者年/月/日;如果不是以上二種格式,則會提供錯誤——錯誤于charTo按照Date(x) : 字符串的格式不夠標準明確;
例如這樣的數(shù)據(jù)格式,就常常報錯。
19:15.
顯示為:2011/1/1 19:15
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
as.Date('23-2013-1',format='%d-%Y-%m')
#其中這個%d%Y可以節(jié)選其中一個
#%Y%y 大寫代表年份四位數(shù),小寫代表年份二位數(shù),要注意
2、%d%y%m-基本格式
格式
意義
%d
月份中當?shù)奶鞌?shù)
%m
月份,以數(shù)字形式表示
%b
月份,縮寫
%B
月份,完整的月份名,指英文
%y
年份,以二位數(shù)字表示
%Y
年份,以四位數(shù)字表示
#其它日期相關函數(shù)
weekdays()取日期對象所處的周幾;
months()取日期對象的月份;
quarters()取日期對象的季度。
————————————————————————————————————————
二、時間型——POSIXct與POSIXlt
POSIXct 是以1970年1月1號開始的以秒進行存儲,如果是負數(shù),則是1970-01-01年以前;正數(shù)則是1970年以后。
POSIXlt 是以列表的形式存儲:年、月、日、時、分、秒,作用是打散時間;
1、POSIXlt 格式
主要特點:作用是打散時間,把時間分成年、月、日、時、分、秒,并進行存儲。
可以作為時間篩選的一種。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> today<-Sys.time()
> unclass(as.POSIXlt(today))
$sec
[1] 53.27151
$min
[1] 38
$hour
[1] 20
$mday
[1] 6
$mon
[1] 5
$year
[1] 116
$wday
[1] 1
$yday
[1] 157
$isdst
[1] 0
$zone
[1] "CST"
$gmtoff
[1] 28800
attr(,"tzone")
[1] "" "CST" "CDT"
代碼解讀:unclass將時間打散。
2、POSIXct 格式
主要特點:以秒進行存儲。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> today<-Sys.time()
> today
[1] "2016-06-06 20:42:22 CST"
> unclass(as.POSIXct(today))
[1] 1465216942
解讀:比如今天,unclass之后,代表今天2016-06-06距離1970-01-01為1465216942秒。
#GMT代表時區(qū),德意志時間,CST也代表時區(qū)
———————————————————————————————————————
三、時間運算
1、基本運算函數(shù)
Sys.Date() #字符串類型
typeof(Sys.Date()) #系統(tǒng)日期類型
2、直接加減
相同的格式才能相互減,不能加。二進列的+法對"Date"、"POSIXt"對象不適用。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> as.Date("2011-07-01") - as.Date(today)
Time difference of -1802 days
> as.POSIXct(today)-as.POSIXct(as.Date("2012-10-25 01:00:00"))
Time difference of 1320.529 days
> as.POSIXlt(today)-as.POSIXlt(as.Date("2012-10-25 01:00:00"))
Time difference of 1320.529 days
相互減之后,一般結(jié)果輸出的天數(shù)。
3、difftime函數(shù)——計算時差
不同格式的時間都可以進行運算。并且可以實現(xiàn)的是計算兩個時間間隔:秒、分鐘、小時、天、星期。
但是不能計算年、月、季度的時間差。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
gtd <- as.Date("2011-07-01")
difftime(as.POSIXct(today), gtd, units="hours") #只能計算日期差,還可以是“secs”, “mins”, “hours”, “days”
4、format函數(shù)——提取關鍵信息
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> today<-Sys.time()
> format(today,format="%B-%d-%Y")
[1] "六月-06-2016"
format函數(shù)可以將時間格式,調(diào)節(jié)成指定時間樣式。format(today,format="%Y")其中的format可以自由調(diào)節(jié),獲取你想要的時間信息。
并且format函數(shù)可以識別as.Data型以及POSIXct與POSIXlt型,將其日期進行提取與之后要討論的split類型。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> today<-Sys.time()
> format(as.Date(today),format="%Y")
[1] "2016"
> format(as.POSIXlt(today),format="%Y")
[1] "2016"
> format(as.POSIXct(today),format="%Y")
[1] "2016"
但是format出來的時間不能直接做減法,會出現(xiàn)錯誤: non-numeric argument to binary operator
5、strptime函數(shù)
該函數(shù)是將字符型時間轉(zhuǎn)化為 "POSIXlt" 和"POSIXct"兩類。跟format比較相似。
strptime之后的時間是可以直接做減法,因為直接是"POSIXlt" 和"POSIXct"格式了。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
> strptime("2006-01-08 10:07:52", "%Y-%m-%d")-strptime("2006-01-15 10:07:52", "%Y-%m-%d")
Time difference of -7 days
> class(strptime("2006-01-08 10:07:52", "%Y-%m-%d"))
[1] "POSIXlt" "POSIXt"
———————————————————————————————————————
四、遇見的問題
1、常常報錯。
錯誤于charTo按照Date(x) : 字符串的格式不夠標準明確。這個錯誤經(jīng)常出現(xiàn),我本來的數(shù)據(jù)格式是
19:15.
后來換成“2011/1/1”這樣的就不會報錯了,需要數(shù)據(jù)庫自動改變。
[plain] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
#幾種錯誤匯總
dtV<-data.frame(as.POSIXct(a$b,format="%d.%m.%Y")) #錯,讀出來都是NA
as.Date(a$b, "%Y年%m月%d日") #錯,讀不出來
as.POSIXct(strptime(a$b, "%Y-%m-%d")) #讀不出來
#轉(zhuǎn)化成xts格式也讀不出來
install.packages("xts")
library(xts)
as.xts(read.zoo("time.csv",header=T))
a <- as.xts(a, descr='my new xts object')
as.xts(read.zoo("a.csv",header=T))
#錯
#轉(zhuǎn)化成數(shù)值型也不對
c=as.numeric(sales[,2])
2、excel另存為csv時發(fā)生的錯誤。
一位網(wǎng)友說:我以前是在excel里另存為csv格式,百度上說CSV檔如果以EXCEL開啟,由于計算機檔案數(shù)據(jù)轉(zhuǎn)換的原因,會將其CRC之數(shù)值改做科學記號方式儲存,而造成檔案中的 CRC值發(fā)生錯誤。
——————————————————————————————————————————————————
應用1——如何通過生日計算年齡
1、format函數(shù)
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
timeformat<-function(x){
format(as.POSIXct(x),format="%Y")
}
sapply(as.Date(data$birthdate),timeformat)
format只能一個一個操作,可以先寫成函數(shù),然后計算得出年份,之后用如今的年份相減得到年齡。
2、字符型——strsplit
先轉(zhuǎn)化為字符型,然后進行分割。
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
data.frame(sapply(as.character(data$birthdate),function(x){strsplit(x,"-")[[1]][1]}))
注意,其中strsplit中的"-",根據(jù)具體時間格式情況來定義。
——————————————————————————————————————————————————
應用2——日期分組
一種按照日期范圍——例如按照周、月、季度或者年——對其進行分組的超簡便處理方式:R語言的cut()函數(shù)。
假設vector中存在以下示例數(shù)據(jù):
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
vDates <- as.Date(c("2013-06-01", "2013-07-08", "2013-09-01", "2013-09-15")) #as.Data()函數(shù)的作用非常重要;如果沒有它,R語言會認為以上內(nèi)容僅僅是數(shù)字串而非日期對象
[1] "2013-06-01" "2013-07-08" "2013-09-01" "2013-09-15"
vDates.bymonth <- cut(vDates, breaks = "month")
[1] 2013-06-01 2013-07-01 2013-09-01 2013-09-01
Levels: 2013-06-01 2013-07-01 2013-08-01 2013-09-01
Dates <- data.frame(vDates, vDates.bymonth)
來源于R語言︱數(shù)據(jù)集分組、篩選
應用三——生成按天的時間序列并進行回歸
如果是生成簡單的年度,月度數(shù)據(jù),ts函數(shù)可以滿足,但是如果生成的是每天。因為有閏年緣故,所以zoo包可以很好地解決這個問題。
還有筆者在做一個簡單的時間序列回歸時候,疑惑:
做關于時間序列的ols最小二乘法回歸方程,按年來好說,但是如果是按天,如果進行計算呢?
1、把天變成一排規(guī)律遞增的數(shù)字來代替;
2、ts函數(shù)變化之后,也是變成一個遞增的數(shù)字。
以上兩種,做的結(jié)果都一樣,所以沒有什么太大的區(qū)別。
關于ts函數(shù)by day每一天的時間序列生成,該如何呢?
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
n=30
t<-ts(1:n,frequency=1,start=as.Date("2010-01-09"))
生成一個按天的時間序列。
——————————————————————————————————————————————————
應用四:靈活處理時間數(shù)據(jù)—lubridate包(來源TipDM)
lubridate包是由Garrett Grolemund 和 Hadley Wickham寫的,可以靈活地處理時間數(shù)據(jù)。lubridate包主要有兩類函數(shù),一類是處理時點數(shù)據(jù)(time instants),另一類是處理時段數(shù)據(jù)(time spans)。
1、時點類函數(shù)
主要包括解析、抽取、修改。
2、時段類函數(shù)
可以處理三類對象,分別是:
interval:最簡單的時段對象,它由兩個時點數(shù)據(jù)構(gòu)成。
duration:去除了時間兩端的信息,純粹以秒為單位計算時段的長度,不考慮閏年和閏秒,它同時也兼容基本包中的difftime類型對象。
period:以較長的時鐘周期來計算時段長度,它考慮了閏年和閏秒,適用于長期的時間計算。以2012年為例,duration計算的一年是標準不變的365天,而period計算的一年就會變成366天。
有了時點和時段數(shù)據(jù),就可以進行各種計算了。
3、時區(qū)信息
lubridate包提供了三個函數(shù):
tz:提取時間數(shù)據(jù)的時區(qū)
with_tz:將時間數(shù)據(jù)轉(zhuǎn)換為另一個時區(qū)的同一時間
force_tz:將時間數(shù)據(jù)的時區(qū)強制轉(zhuǎn)換為另一個時區(qū)
——————————————————————————————————————————————————
應用五:如何在循環(huán)、函數(shù)中,輸出實時時間消耗?
想知道循環(huán)中進行到哪里?這樣可以合理安排函數(shù)進程。那么怎么辦呢?
第一辦法:使用Rstudio 1.0版本,里面有一個Profiling with profvis,可以很好的對你函數(shù)每一步的耗時進行參看。
R︱Rstudio 1.0版本嘗鮮(R notebook、下載鏈接、sparkR、代碼時間測試profile)
當然,這個不能實時輸出內(nèi)容。
第二辦法:利用difftime函數(shù)
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
t1 = Sys.time()
for (i in 1:5){
a=a+1
b=a*a
print(difftime(Sys.time(), t1, units = 'sec'))
}
先預設當前時間,然后用difftime+print方式,循環(huán)輸出。
—————————————————————————————————
應用六:因子型數(shù)據(jù)轉(zhuǎn)化為數(shù)值型
因子型轉(zhuǎn)化的時候會發(fā)現(xiàn),譬如10000這個數(shù)字,會變?yōu)?,也就是因子型里面對應的次序,這樣并不是我們想要的。所以,可以先變?yōu)樽址蚢s.character:
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
as.numeric(as.character(data))
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10