2013-10-24 71 views
5

如何將日期轉換爲從一年的第一天開始的天數。如何將日期轉換爲R中的天數

如何將以下內容轉換爲以下預期結果?

Date    
02/01/2000   
20/02/2000   
12/12/2000   
13/01/2001 

以下是預期結果。

Date    NumDays TotalDays 
02/01/2000   1   1 
20/02/2000   51   51 
12/12/2000   346  346 
13/01/2001   13   379 
+0

嗨,歡迎來到stackoverflow!請閱讀[關於Stackoverflow](http://stackoverflow.com/about)和[問什麼](http://stackoverflow.com/help/on-topic)。正如你在這兩個鏈接中發現的,你應該「展示你的工作!」。那就是:「詢問代碼的問題必須包括嘗試解決方案,爲什麼他們不工作」。感謝您提供一個小的虛擬數據集和所需的結果! – Henrik

+1

「NumDays」應該是一年中的第n天,還是自1月1日以來的天數?例如,'02/01/2000'是一年中的第二天,但是從2000年1月1日開始的1天是今年的第51天,但是自1月1日以來的50天。 –

回答

1
startvalue <- "01/01/2000" 
dt <- data.table(
datevalue <- c("13/01/2001","12/12/2000") 
) 
DateFormat <- "%d/%m/%Y" 

dt[,datevalue := as.Date(datevalue,DateFormat)] 
startvalue <- as.Date(startvalue,DateFormat) 

dt[,TotalDays := datevalue - startvalue] 

dt[,Jan01 := as.Date(paste0('01/01/',strftime(datevalue,'%Y')),DateFormat)] 
dt[,NumDays := datevalue - Jan01] 
1

我想這會幫助:

使用as.Date()

例子:

one <- as.Date(c("02/01/2000", "01/01/2000")) 

2000年2月1日和2000年2月1日之間的天數:

days <- one[1] - one[2] 
1

%j日期時間格式標誌會給你一年中的天從0開始。

d <- read.table(text='Date 
02/01/2000   
20/02/2000   
12/12/2000   
13/01/2001', header=TRUE) 

d<-transform(d, NumDays=as.numeric(strftime(as.Date(Date, format='%d/%m/%Y'), '%j'))-1) 
#   Date NumDays 
# 1 02/01/2000  1 
# 2 20/02/2000  50 
# 3 12/12/2000  346 
# 4 13/01/2001  12 

然後添加TotalDays,你可以使用cumsum一些模運算,

transform(d, TotalDays=cumsum(c(1, ifelse(diff(NumDays) > 0, diff(NumDays), diff(NumDays) %% 365 + 1)))) 
#   Date NumDays TotalDays 
# 1 02/01/2000  1   1 
# 2 20/02/2000  50  50 
# 3 12/12/2000  346  346 
# 4 13/01/2001  12  378 

或者使用這個較短的選擇。

transform(d, TotalDays=cumsum(c(1, diff(as.Date(Date, format='%d/%m/%Y'))))) 
+0

謝謝。這工作完美。但是,如何獲得Numtotal專欄,我不必在新的一年重新開始計數? – user18143

+0

哎呦,錯過了那部分。我已經更新了我的答案。 –

+0

新代碼沒有產生所需的輸出。第一個選項給日期DKM TotalDays 1 1980年1月3日1.683748 1 2 1980年1月4日2.093704 86401 3 1980年1月5日1.732581 172801 4 1980年1月7日1.779754 345601 5 1980年1月7日4.612006 345601 6 1980年1月10日 – user18143

3

假設你想計算1月1日年爲0,我們得到:

DF <- data.frame(Date = c("02/01/2000", "20/02/2000", "12/12/2000", "13/01/2001")) 
DF$Date <- as.Date(DF$Date, "%d/%m/%Y") 

Diff <- function(x, start) as.numeric(x - as.Date(cut(start, "year"))) 
transform(DF, NumDays = Diff(Date, Date), TotalDays = Diff(Date, Date[1])) 

這給;

 Date NumDays TotalDays 
1 2000-01-02  1   1 
2 2000-02-20  50  50 
3 2000-12-12  346  346 
4 2001-01-13  12  378 

如果你想指望1月1日爲1,那麼在Diff加1的表達。

更新:更正。

更新:增加了DF定義,使其自包含。

更新:我們在下面的評論中使用數據添加運行。

> DF <- data.frame(Date = as.Date(c("1980-01-03", "1980-01-04", "1980-01-05", 
+ "1980-01-07", "1980-01-10", "1980-01-16"))) 
> 
> Diff <- function(x, start) as.numeric(x - as.Date(cut(start, "year"))) 
> transform(DF, NumDays = Diff(Date, Date), TotalDays = Diff(Date, Date[1])) 
     Date NumDays TotalDays 
1 1980-01-03  2   2 
2 1980-01-04  3   3 
3 1980-01-05  4   4 
4 1980-01-07  6   6 
5 1980-01-10  9   9 
6 1980-01-16  15  15 
+0

+1這是我的這裏最喜歡。很好,很清楚。 –

+0

@ G.Grothendieck它的工作原理,但價值大於預期。以下是我得到的結果X_data NumDays TotalDays 1 1980-01-03 172800 172800 2 1980-01-04 259200 259200 3 1980-01-05 345600 345600 4 1980-01-07 518400 518400 5 1980-01 -07 518400 518400 6 1980-01-10 777600 777600 7 1980-01-10 777600 777600 8 1980-01-16 1296000 1296000 – user18143

+0

這可能是由於您提供的內容和您真正擁有的內容之間的某些差異。我已經在上面的帖子中顯示了一個運行,它似乎工作。 –

2

裝入數據集

df <- structure(list(Date = structure(c(1L, 4L, 2L, 3L), .Label = c("02/01/2000", 
"12/12/2000", "13/01/2001", "20/02/2000"), class = "factor"), 
    Date2 = structure(c(10958, 11007, 11303, 11335), class = "Date"), 
    NumDays = structure(c(1, 50, 346, 378), units = "days", class = "difftime")), .Names = c("Date", 
"Date2", "NumDays"), row.names = c(NA, -4L), class = "data.frame") 

格式日期:

startdate <- as.Date("01/01/2000","%d/%m/%Y") 
df$Date2 <- as.Date(df$Date,"%d/%m/%Y") 

使用difftime來計算天

df$NumDays <- difftime(df$Date2,startdate ,units="days") 

df 

     Date  Date2 NumDays 
# 1 02/01/2000 2000-01-02 1 days 
# 2 20/02/2000 2000-02-20 50 days 
# 3 12/12/2000 2000-12-12 346 days 
# 4 13/01/2001 2001-01-13 378 days 
7

這裏的差異是一個使用lubridate帕茨卡的解決方案ge:

library(lubridate) 

x <- c("02/01/2000", "20/02/2000", "12/12/2000", "13/01/2001") 
date <- dmy(x) 

days <- yday(date) - 1 # so Jan 1 = day 0 
total_days <- cumsum(days)