簡體   English   中英

使用R獲取一年中所有日子的向量

[英]Get a vector of all days in a year with R

是否有一個簡單的R習慣用於獲取給定年份中的日期向量? 除了閏年之外,我可以做以下事情。

dtt <- as.Date( paste( as.character(year), "-1-1", sep="") ) + seq( 0,364 )

顯然,我可以添加一行來過濾掉(年+ 1)中的任何值,但我猜測有更短的方法可以做到這一點。

那這個呢:

R> length(seq( as.Date("2004-01-01"), as.Date("2004-12-31"), by="+1 day"))
[1] 366
R> length(seq( as.Date("2005-01-01"), as.Date("2005-12-31"), by="+1 day"))
[1] 365
R> 

這使用了nuttin'但是基數R可以在日期上正確計算,以便為您提供向量。 如果你想要更高級別的運算符,請查看例如lubridate甚至是更基本的RcppBDT ,它包含了Boost Time_Date庫的部分內容。

使用Dirk的指導我已經解決了這個問題:

getDays <- function(year){
     seq(as.Date(paste(year, "-01-01", sep="")), as.Date(paste(year, "-12-31", sep="")), by="+1 day")
}

我需要類似的東西,但是對於一系列日期我想知道那一年的天數。 我想出了以下函數,它返回一個與輸入中的日期長度相同的向量。

days_in_year <- function(dates) {
    years <- year(dates)
    days <- table(year(seq(as.Date(paste0(min(years), '-01-01')),
                           as.Date(paste0(max(years), '-12-31')),
                           by = '+1 day')))
    as.vector(days[as.character(years)])
}

它與Dirk的解決方案類似,但它使用lubridate::year函數將所有日期的年份部分兩次。 使用表與長度相同,但是對於所有獨特年份。 如果日期不是連續幾年,它可能會使用比嚴格必要更多的內存。

我有興趣知道是否可以更快地反轉排序和鑄造as.Date

# My function getDays
getDays_1 <- function(year) {
  d1 <- as.Date(paste(year, '-01-01', sep = ''));
  d2 <- as.Date(paste(year, '-12-31', sep = ''));
  as.Date(d1:d2, origin = '1970-01-01');
};

# other getDays
getDays_2 <- function(year) {      
  seq(as.Date(paste(year, '-01-01', sep='')), 
      as.Date(paste(year, '-12-31', sep='')), 
      by = '+1 day');
};

test_getDays_1 <- function(n = 10000) {
  for(i in 1:n) {
    getDays_1(2000);
  };
};

test_getDays_2 <- function(n = 10000) {
  for(i in 1:n) {
    getDays_2(2000);
  };
};

system.time(test_getDays_1());
# user  system elapsed 
# 4.80    0.00    4.81 

system.time(test_getDays_2());
# user  system elapsed 
# 4.52    0.00    4.53 

我猜不會 。 看起來排序Date對象比將整數向量轉換為Date s要快一些

暫無
暫無

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

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