如何将R中的日期转换为天数

如何将R中的日期转换为天数,r,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

如何将日期转换为天数,从一年的第一天开始

如何将以下内容转换为下面的预期结果

   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我想这会有帮助:

用作.Date()

例如:

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

one
%j
datetime格式化标志将显示一年中从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
或者使用这个较短的替代方案

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]))
如果要将一月一日计算为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
>DF
>差异转换(DF,NumDays=Diff(日期,日期),TotalDays=Diff(日期,日期[1]))
日期NumDays总天数
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
加载数据集

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")

以下是使用lubridate软件包的解决方案:

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)
库(lubridate)

x您也可以使用此解决方案来获得天数:


mydates大家好,欢迎来到stackoverflow!请阅读和阅读。正如您将在这两个链接中看到的,您应该“显示您的工作!”。也就是说:“询问代码的问题必须包括尝试过的解决方案,为什么它们不起作用”。感谢您提供了一个小的虚拟数据集和所需的结果!
NumDays
应该是一年中的第n天,还是自1月1日起的天数?例如,
02/01/2000
是一年中的第2天,但自1月1日起1天。
20/02/2000
是一年中的第51天,但自1月1日起50天。谢谢。这很好用。但是我如何才能得到Numtotal列,而不必在新的一年里重新开始计数?新代码没有产生所需的输出。第一个选项给出的日期为DKM TotalDays 1 01/03/1980 1.683748 1 2 01/04/1980 2.093704 86401 3 01/05/1980 1.732581 172801 4 01/07/1980 1.779754 345601 5 01/07/1980 4.612006 345601 6 01/10/1980,而备选代码给出的日期为DKM NumDays TotalDays 1 01/03/19801.683748 2 1 2 01/04/1980 2.093704 3 2 3 01/05/1980 1.732581 4 4 01/07/1980 1.779754 6 5 01/07/1980 4.612006 6 6 6 01/10/1980 8.725274 9 9 7 01/10/1980 7.898975 9 10如果总天数计数减少一。我想我会通过在TotalDays列中添加一个来排序。日期DKM NumDays总计天数1980年01月03日1.683748 2 1 2 01/04/1980年2.093704 3 2 3 01/05/1980年1.732581 4 3 4 01/07/1980年1.779754 6 5 01/07/1980年4.612006 6 6 01/10/1980 8.725274 9 8 7 01/10/19807.898975 9 8 8 01/16/1980 2.208045 15 14 9 01/16/1980 1.486091 15 14@G.Grothendieck它可以工作,但值大于预期值。下面是我得到的X_数据天数总计的结果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这是可能的因为你所展示的和你真正拥有的有些不同。我在上面的帖子中展示了一个run,它似乎很有效。这应该是最好的答案,因为它很简单,并且只使用标准库。
        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
> 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
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")
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
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)