99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀R語言與格式、日期格式、格式轉(zhuǎn)化
R語言與格式、日期格式、格式轉(zhuǎn)化
2017-04-20
收藏

R語言與格式、日期格式、格式轉(zhuǎn)化

R語言的基礎(chǔ)包中提供了兩種類型的時間數(shù)據(jù),一類是Date日期數(shù)據(jù),它不包括時間和時區(qū)信息,另一類是POSIXct/POSIXlt類型數(shù)據(jù),其中包括了日期、時間和時區(qū)信息。基本總結(jié)如下:

日期data,存儲的是天;
時間POSIXct 存儲的是秒,POSIXlt 打散,年月日不同;
日期-時間=不可運(yùn)算。

一般來講,R語言中建立時序數(shù)據(jù)是通過字符型轉(zhuǎn)化而來,但由于時序數(shù)據(jù)形式多樣,而且R中存貯格式也是五花八門,例如Date/ts/xts/zoo/tis/fts等等。lubridate包(后續(xù)有介紹,應(yīng)用四),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中,是可以實(shí)現(xiàn)數(shù)據(jù)集重命名的,比如data.frame(x=iris,y=cars),

也可以實(shí)現(xiàn)橫向、縱向重命名,data.frame(x=iris,y=cars,row.names=iris)

——————————————————————————————————————————

后續(xù)加更內(nèi)容

應(yīng)用1——如何通過生日計(jì)算年齡
應(yīng)用2——日期分組
應(yīng)用三——生成按天的時間序列并進(jìn)行回歸
應(yīng)用四:靈活處理時間數(shù)據(jù)—lubridate包(來源TipDM)
應(yīng)用五:如何在循環(huán)、函數(shù)中,輸出實(shí)時時間消耗?

——————————————————————————————————————————
時間的標(biāo)準(zhǔn)格式

mydate = as.POSIXlt(’2005-4-19 7:01:00’)
names(mydate)

默認(rèn)情況下,日期之前是以/或者-進(jìn)行分隔,而時間則以:進(jìn)行分隔;

輸入的標(biāo)準(zhǔn)格式為:日期 時間(日期與時間中間有空隔隔開)

時間的標(biāo)準(zhǔn)格式為:時:分 或者 時:分:秒;

如果輸入的格式不是標(biāo)準(zhǔn)格式,則同樣需要使用strptime函數(shù),利用format來進(jìn)行指定。

——————————————————————————————————————————

一、日期型數(shù)據(jù)——data
1、as.Data函數(shù)

在R中自帶的日期形式為:as.Date();以數(shù)值形式存儲;

對于規(guī)則的格式,則不需要用format指定格式;如果輸入的格式不規(guī)則,可以通過format指定的格式讀入;其中以1970-01-01定義為第0天,之后的年份會以距離這天來計(jì)算。

[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可以將日期變成以天來計(jì)數(shù),比如1970-02-01輸出的31,就代表著距離1970-01-01有31天。

as.data中的參數(shù)格式:年-月-日或者年/月/日;如果不是以上二種格式,則會提供錯誤——錯誤于charTo按照Date(x) : 字符串的格式不夠標(biāo)準(zhǔn)明確;

例如這樣的數(shù)據(jù)格式,就常常報(bào)錯。

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
   
月份中當(dāng)?shù)奶鞌?shù)

%m
   
月份,以數(shù)字形式表示

%b
   
月份,縮寫

%B
   
月份,完整的月份名,指英文

%y
  
年份,以二位數(shù)字表示

%Y
   
年份,以四位數(shù)字表示

#其它日期相關(guān)函數(shù)
weekdays()取日期對象所處的周幾;
months()取日期對象的月份;
quarters()取日期對象的季度。

————————————————————————————————————————

二、時間型——POSIXct與POSIXlt

POSIXct 是以1970年1月1號開始的以秒進(jìn)行存儲,如果是負(fù)數(shù),則是1970-01-01年以前;正數(shù)則是1970年以后。
POSIXlt 是以列表的形式存儲:年、月、日、時、分、秒,作用是打散時間;

1、POSIXlt 格式

主要特點(diǎn):作用是打散時間,把時間分成年、月、日、時、分、秒,并進(jìn)行存儲。

可以作為時間篩選的一種。

[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 格式

主要特點(diǎn):以秒進(jìn)行存儲。

[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ū)
———————————————————————————————————————

三、時間運(yùn)算

1、基本運(yùn)算函數(shù)

Sys.Date()                 #字符串類型

typeof(Sys.Date())   #系統(tǒng)日期類型

2、直接加減

相同的格式才能相互減,不能加。二進(jìn)列的+法對"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ù)——計(jì)算時差

不同格式的時間都可以進(jìn)行運(yùn)算。并且可以實(shí)現(xiàn)的是計(jì)算兩個時間間隔:秒、分鐘、小時、天、星期。

但是不能計(jì)算年、月、季度的時間差。

[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    gtd <- as.Date("2011-07-01")   
    difftime(as.POSIXct(today), gtd, units="hours")    #只能計(jì)算日期差,還可以是“secs”, “mins”, “hours”, “days”  

4、format函數(shù)——提取關(guān)鍵信息

[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型,將其日期進(jìn)行提取與之后要討論的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之后的時間是可以直接做減法,因?yàn)橹苯邮?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、常常報(bào)錯。

錯誤于charTo按照Date(x) : 字符串的格式不夠標(biāo)準(zhǔn)明確。這個錯誤經(jīng)常出現(xiàn),我本來的數(shù)據(jù)格式是

19:15.
后來換成“2011/1/1”這樣的就不會報(bào)錯了,需要數(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開啟,由于計(jì)算機(jī)檔案數(shù)據(jù)轉(zhuǎn)換的原因,會將其CRC之?dāng)?shù)值改做科學(xué)記號方式儲存,而造成檔案中的 CRC值發(fā)生錯誤。

——————————————————————————————————————————————————
應(yīng)用1——如何通過生日計(jì)算年齡

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ù),然后計(jì)算得出年份,之后用如今的年份相減得到年齡。

2、字符型——strsplit

先轉(zhuǎn)化為字符型,然后進(jìn)行分割。

[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    data.frame(sapply(as.character(data$birthdate),function(x){strsplit(x,"-")[[1]][1]}))  

注意,其中strsplit中的"-",根據(jù)具體時間格式情況來定義。

——————————————————————————————————————————————————
應(yīng)用2——日期分組

一種按照日期范圍——例如按照周、月、季度或者年——對其進(jìn)行分組的超簡便處理方式:R語言的cut()函數(shù)。

假設(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語言會認(rèn)為以上內(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ù)集分組、篩選

應(yīng)用三——生成按天的時間序列并進(jìn)行回歸

如果是生成簡單的年度,月度數(shù)據(jù),ts函數(shù)可以滿足,但是如果生成的是每天。因?yàn)橛虚c年緣故,所以zoo包可以很好地解決這個問題。

還有筆者在做一個簡單的時間序列回歸時候,疑惑:

做關(guān)于時間序列的ols最小二乘法回歸方程,按年來好說,但是如果是按天,如果進(jìn)行計(jì)算呢?

   1、把天變成一排規(guī)律遞增的數(shù)字來代替;

   2、ts函數(shù)變化之后,也是變成一個遞增的數(shù)字。

以上兩種,做的結(jié)果都一樣,所以沒有什么太大的區(qū)別。

關(guān)于ts函數(shù)by day每一天的時間序列生成,該如何呢?

[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片

    n=30  
    t<-ts(1:n,frequency=1,start=as.Date("2010-01-09"))  

生成一個按天的時間序列。
——————————————————————————————————————————————————
應(yīng)用四:靈活處理時間數(shù)據(jù)—lubridate包(來源TipDM)

lubridate包是由Garrett Grolemund 和 Hadley Wickham寫的,可以靈活地處理時間數(shù)據(jù)。lubridate包主要有兩類函數(shù),一類是處理時點(diǎn)數(shù)據(jù)(time instants),另一類是處理時段數(shù)據(jù)(time spans)。

1、時點(diǎn)類函數(shù)

主要包括解析、抽取、修改。

2、時段類函數(shù)

可以處理三類對象,分別是:

interval:最簡單的時段對象,它由兩個時點(diǎn)數(shù)據(jù)構(gòu)成。

duration:去除了時間兩端的信息,純粹以秒為單位計(jì)算時段的長度,不考慮閏年和閏秒,它同時也兼容基本包中的difftime類型對象。

period:以較長的時鐘周期來計(jì)算時段長度,它考慮了閏年和閏秒,適用于長期的時間計(jì)算。以2012年為例,duration計(jì)算的一年是標(biāo)準(zhǔn)不變的365天,而period計(jì)算的一年就會變成366天。

有了時點(diǎn)和時段數(shù)據(jù),就可以進(jìn)行各種計(jì)算了。

3、時區(qū)信息

lubridate包提供了三個函數(shù):

tz:提取時間數(shù)據(jù)的時區(qū)

with_tz:將時間數(shù)據(jù)轉(zhuǎn)換為另一個時區(qū)的同一時間

force_tz:將時間數(shù)據(jù)的時區(qū)強(qiáng)制轉(zhuǎn)換為另一個時區(qū)

——————————————————————————————————————————————————
應(yīng)用五:如何在循環(huán)、函數(shù)中,輸出實(shí)時時間消耗?

      想知道循環(huán)中進(jìn)行到哪里?這樣可以合理安排函數(shù)進(jìn)程。那么怎么辦呢?

      第一辦法:使用Rstudio 1.0版本,里面有一個Profiling with profvis,可以很好的對你函數(shù)每一步的耗時進(jìn)行參看。

R︱Rstudio 1.0版本嘗鮮(R notebook、下載鏈接、sparkR、代碼時間測試profile)

當(dāng)然,這個不能實(shí)時輸出內(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'))  
    } 
      先預(yù)設(shè)當(dāng)前時間,然后用difftime+print方式,循環(huán)輸出。
—————————————————————————————————
應(yīng)用六:因子型數(shù)據(jù)轉(zhuǎn)化為數(shù)值型

因子型轉(zhuǎn)化的時候會發(fā)現(xiàn),譬如10000這個數(shù)字,會變?yōu)?,也就是因子型里面對應(yīng)的次序,這樣并不是我們想要的。所以,可以先變?yōu)樽址蚢s.character:
[html] view plain copy
print?在CODE上查看代碼片派生到我的代碼片
    as.numeric(as.character(data)) 

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }