如何將日期轉換爲從一年的第一天開始的天數。如何將日期轉換爲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
如何將日期轉換爲從一年的第一天開始的天數。如何將日期轉換爲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
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]
我想這會幫助:
使用as.Date()
例子:
one <- as.Date(c("02/01/2000", "01/01/2000"))
2000年2月1日和2000年2月1日之間的天數:
days <- one[1] - one[2]
的%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')))))
假設你想計算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
+1這是我的這裏最喜歡。很好,很清楚。 –
@ 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
這可能是由於您提供的內容和您真正擁有的內容之間的某些差異。我已經在上面的帖子中顯示了一個運行,它似乎工作。 –
裝入數據集
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
這裏的差異是一個使用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)
嗨,歡迎來到stackoverflow!請閱讀[關於Stackoverflow](http://stackoverflow.com/about)和[問什麼](http://stackoverflow.com/help/on-topic)。正如你在這兩個鏈接中發現的,你應該「展示你的工作!」。那就是:「詢問代碼的問題必須包括嘗試解決方案,爲什麼他們不工作」。感謝您提供一個小的虛擬數據集和所需的結果! – Henrik
「NumDays」應該是一年中的第n天,還是自1月1日以來的天數?例如,'02/01/2000'是一年中的第二天,但是從2000年1月1日開始的1天是今年的第51天,但是自1月1日以來的50天。 –