簡體   English   中英

將日期轉換為年月表示

[英]Convert Date to year month representation

我有一個Date ,並且有興趣將它表示為yyyymm形式的整數。 目前,我這樣做:

get_year_month <- function(d) { return(as.integer(format(d, "%Y%m")))}
mydate = seq.Date(from = as.Date("2012-01-01"), to = as.Date("5012-01-01"), by = 1) 
system.time(ym <- get_year_month(mydate))
#    user  system elapsed 
#    5.972   0.974   6.951 

這對於大型數據集來說非常慢。 有沒有更快的方法? 請提供回答的時間,以便於比較。 使用上面的例子。

使用lubridate包中的函數的速度幾乎是您的函數的兩倍:

mydate = as.Date(rep("2012-01-01",1000))
library(lubridate)
library(microbenchmark)
microbenchmark(get_year_month(mydate),
               year(mydate)*100+month(mydate))

給出:

R> Unit: milliseconds
                               expr      min       lq   median       uq
             get_year_month(mydate) 2.150296 2.188370 2.218176 2.285973
 year(mydate) * 100 + month(mydate) 1.220016 1.228129 1.239704 1.284568

您可以嘗試使用zoo包中的yearmon類。 一般來說,如果您正在進行時間序列操作和分析,我建議使用xts或至少zoo類。 xts具有許多用於分析非常大的時間序列數據的功能。

這是針對其他建議解決方案的快速基准測試。

get_year_month <- function(d) {
    return(as.integer(format(d, "%Y%m")))
}
mydate = as.Date(rep("2012-01-01", 1e+06))

microbenchmark(get_year_month(mydate), year(mydate) * 100 + month(mydate), as.yearmon(mydate, format = "%Y-%m-%d"), times = 1)
## Unit: milliseconds
##                                     expr       min        lq    median        uq       max neval
##                   get_year_month(mydate) 1049.8813 1049.8813 1049.8813 1049.8813 1049.8813     1
##       year(mydate) * 100 + month(mydate)  434.1765  434.1765  434.1765  434.1765  434.1765     1
##  as.yearmon(mydate, format = "%Y-%m-%d")  249.6704  249.6704  249.6704  249.6704  249.6704     1

如果您想像這樣操作日期,最好將日期保持在POSIXlt格式:

> system.time(ym <- get_year_month(mydate))
   user  system elapsed 
  4.039   0.025   4.079 
> system.time(mydatep <- as.POSIXlt(mydate))
   user  system elapsed 
  3.576   0.016   3.603 
> system.time(ym <- (1900 + mydatep$year)*100 + (mydatep$mon + 1))
   user  system elapsed 
  0.010   0.005   0.015 

它仍然更快一點,並且您可以免費獲得后續類似的操作,就時間而言。

對於單個項目,可能沒有更快的方法。 但是,您可以使用內置復制(例如)使對集合運行的函數版本比線性運行速度快得多

function mydate(D) {
  x <- replicate(dim(D)[0], get_year_month(..)
  return(x)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM