Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复R中损坏的日期?_R_Date - Fatal编程技术网

如何修复R中损坏的日期?

如何修复R中损坏的日期?,r,date,R,Date,我的数据集如下: 1997年9月19日 22/9/1997 23/9/1997 24/9/1997 25/9/1997 26/9/1997 29/9/1997 1997年9月30日 35440 35471 35499 35591 35621 35652 35683 35713 1997年10月13日 14/10/1997 15/10/1997 16/10/1997 17/10/1997 20/10/1997 21/10/1997 22/10/1997 23/10/1997 24/10/1997

我的数据集如下:

1997年9月19日 22/9/1997 23/9/1997 24/9/1997 25/9/1997 26/9/1997 29/9/1997 1997年9月30日

35440 35471 35499 35591 35621 35652 35683 35713

1997年10月13日 14/10/1997 15/10/1997 16/10/1997 17/10/1997 20/10/1997 21/10/1997 22/10/1997 23/10/1997 24/10/1997 27/10/1997 28/10/1997 29/10/1997 30/10/1997 1997年10月31日

35500 35531 35561 35592 35622 35714 35745 35775

1997年11月13日 14/11/1997 17/11/1997 18/11/1997 19/11/1997 20/11/1997 21/11/1997 1997年11月24日

此处应包含的数据为(按要求复制) 19/9/1997 22/9/1997 23/9/1997 24/9/1997 25/9/1997 26/9/1997 29/9/1997 30/9/1997 10/01/1997 10/02/1997 10/03/1997 10/06/1997 10/07/1997 10/08/1997 10/09/1997 10/10/1997 13/10/1997 14/10/1997 15/10/1997 16/10/1997 17/10/1997 20/10/1997 21/10/1997 22/10/1997 23/10/1997 24/10/1997 27/10/1997 28/10/1997 29/10/1997 30/10/1997 31/10/1997 11/03/1997 11/04/1997 11/05/1997 11/06/1997 11/07/1997 11/10/1997 11/11/1997 11/12/1997 13/11/1997 14/11/1997 17/11/1997 18/11/1997 19/11/1997 20/11/1997 21/11/1997 1997年11月24日

我有5149行日期,其中日期的位置有数字。我尝试用以下方法修复丢失的日期: 修订前尝试1:

  rm (list = ls(all=TRUE))
    graphics.off()
    library(readxl)
    Dates <- read_excel("F:/OneDrive - University of Tasmania/Mardi Meetings/Dataset/Dates.xlsx")
    x<-Dates[,1]
    library(date)
    library(datetime)
    ans <- Reduce(function(prev, curr) {
      f1 <- as.Date(curr, "%d/%m/%Y")
      f2 <- as.Date(curr, "%m/%d/%Y")
      if (is.na(f1)) return(f2)
      if (is.na(f2)) return(f1)
      if (prev < f1 && prev < f2) return(min(f1, f2))
      if (prev < f1) return(f1)
      if (prev < f2) return(f2)
    }, x[-1], init=as.Date(x[1], "%d/%m/%Y"), accumulate=TRUE)

    as.Date(ans, origin="1970-01-01")
如有任何建议,将不胜感激

根据建议,我在修订后修订了代码尝试2

    > rm (list = ls(all=TRUE))
    > graphics.off()
    > library(readxl)
    > Dates <- read_excel("F:/OneDrive - University of Tasmania/Mardi Meetings/Dataset/Dates.xlsx")
    > dput(head(Dates))
    structure(list(Date = c("33274", "33302", "33394", "33424", "33455", 
    "33486")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
    "data.frame"))
    > x<-Dates[[1]] 
    > library(date) 
    > library(datetime) 

    Attaching package: ‘datetime’

    The following object is masked from ‘package:date’:

        as.date

    > dates <- as.Date(x, format="%d/%m/%Y")
    > dput(head(dates))
    structure(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_), class = "Date")
    > head(dates,10)
     [1] NA           NA           NA           NA           NA           NA           NA          
     [8] "1991-05-13" "1991-05-14" "1991-05-15"
As you can see I have lost the corrupted dates completely
>rm(list=ls(all=TRUE))
>graphics.off()
>图书馆(readxl)
>日期dput(标题(日期))
结构(列表日期=c(“33274”、“33302”、“33394”、“33424”、“33455”),
“33486”)),row.names=c(NA,-6L),class=c(“tbl_-df”,“tbl”,
“data.frame”))
>x图书馆(日期)
>图书馆(日期时间)
附加程序包:“日期时间”
以下对象已从“包:日期”屏蔽:
截止日期
>日期dput(标题(日期))
结构(c)(NA_real_uuu,NA_real_uu,NA_real_uu,NA_real_uu,
NA_real(日期),class=“日期”)
>总干事(日期,10)
[1] 娜娜娜娜娜娜娜娜
[8] "1991-05-13" "1991-05-14" "1991-05-15"
正如你所看到的,我已经完全丢失了损坏的日期
今天28号我又试了一次

> rm (list = ls(all=TRUE))
> graphics.off()
> library(readxl)
> Dates <- read_excel("F:/OneDrive - University of Tasmania/Mardi Meetings/Dataset/Dates.xlsx")
> x<-Dates[[1]] 
> 
> library(date) 
> library(datetime) 

Attaching package: ‘datetime’

The following object is masked from ‘package:date’:

    as.date

> formats <- c("%m/%d/%Y", "%d/%m/%Y", "%Y/%m/%d")
> dates <- as.Date(rep(NA, length(x)))
> for (fmt in formats) {
+   nas <- is.na(dates)
+   dates[nas] <- as.Date(as.integer(x[nas], format=fmt))
+ }
Error in as.Date.numeric(as.integer(x[nas], format = fmt)) : 
  'origin' must be supplied
In addition: Warning message:
In as.Date(as.integer(x[nas], format = fmt)) : NAs introduced by coercion
> dates <- as.Date(x, format="%d/%m/%Y")
> head(dates)
[1] NA NA NA NA NA NA
> head(dates, 10)
 [1] NA           NA           NA           NA           NA           NA           NA          
 [8] "1991-05-13" "1991-05-14" "1991-05-15"
>rm(list=ls(all=TRUE))
>graphics.off()
>图书馆(readxl)
>日期x
>图书馆(日期)
>图书馆(日期时间)
附加程序包:“日期时间”
以下对象已从“包:日期”屏蔽:
截止日期
>日期格式(格式为fmt){
+nas负责人(日期,10)
[1] 娜娜娜娜娜娜娜娜
[8] "1991-05-13" "1991-05-14" "1991-05-15"

您不需要加载任何软件包,也不需要使用
Reduce
,因为我们在这里使用的函数自然是“矢量化”的

这是您的数据示例。(一个好问题包括像这样易于复制的格式的数据。)

其中
[is.na(dates)]
仅适用于未转换的元素

(2) 如果我们有多个其他格式,您可以始终使用它们的向量并在其上循环(对于这一点,我将重新开始,因为此循环将替换/补充上面的第一步)

但似乎您的日期的来源是
“1900-01-01”
,我认为这是Excel默认的日期存储(但在这里并不重要):

(我假设您的日期来自相同的相对时间段。)

从这里开始:

nas <- is.na(dates)
dates[nas] <- as.Date(as.integer(x[nas]), origin="1900-01-01")
dates
#  [1] "1997-09-19" "1997-09-22" "1997-09-23" "1997-09-24" "1997-09-25"
#  [6] "1997-09-26" "1997-09-29" "1997-09-30" "1997-01-12" "1997-02-12"
# [11] "1997-03-12" "1997-06-12" "1997-07-12" "1997-08-12" "1997-09-12"
# [16] "1997-10-12"

nas是关于“损坏的日期”的问题,还是关于未找到的
'x
?因为我们没有您的数据,所以很难解决这方面的问题。也许您可以提供来自
dput(head(x))的输出
在调用
Reduce
之前?您好,谢谢您的回复。X是日期向量。就在代码之前,在顶部,您将看到列出的日期。它们是一列中的行?正如您所看到的,在1997年9月30日之后,下一行是3559。这就是它们损坏的原因。日期信息是从datastream收集的。您有几个日期格式的行和一些日期只是变成数字。我需要按顺序排列日期中的所有行。日期不是按时间顺序排列的。它们表示一周中的一些天,然后是不存在的一些天。下周的一些天。请不要发布类似于
rm(list=ls())的代码
在您的问题中。我们希望能够复制并运行您的代码,而不必担心它会破坏我们计算机上正在进行的工作。@Gregor,有时我想知道是否应该在R沙箱中尝试这样的代码……是否有一种简单的方法可以暂时将
.GlobalEnv
移开?不是万无一失,而是更接近…:-)不是我知道的简单方法…我有时会打开两个RStudio实例,一个用于工作,另一个用于堆栈溢出。我现在明白了,这对我来说是显而易见的。
readxl::read_excel
返回一个TIBLE,它与
数据略有不同。frame
:当使用
[,1]
索引时,一个frame将(几乎)返回一个TIBLE始终返回一个向量,TIBLE将始终返回一个(单列)帧。尝试
mtcars[,1]
tbl_df(mtcars)[,1]
。在这种情况下,您需要查看对象以了解发生了什么,其中
类(x)
很可能表示
数据。当
as.Date
仅接受向量时,frame
。(我再说一遍:可复制的数据样本。
dput(head(x))
的输出会让我们中的许多人都很清楚。)因此,一个答案是替换
xR.Islam,我真的不确定根本的问题是什么。是因为您的函数不知道如何处理
数据。frame
/
tibble
?还是因为您不知道如何使用
Reduce
(顺便说一句,这是错误的函数)要将您的列转换为
Date
类型?您还在
tible
上使用
Date[,1]
吗?听着,在您提供可复制的数据之前,我真的无能为力。我知道您说的是
x <- c("19/9/1997", "22/9/1997", "23/9/1997", "24/9/1997", "25/9/1997",
       "26/9/1997", "29/9/1997", "30/9/1997",
       "35440", "35471", "35499", "35591", "35621",
       "35652", "35683", "35713")

dates <- as.Date(x, format="%d/%m/%Y")
dates
#  [1] "1997-09-19" "1997-09-22" "1997-09-23" "1997-09-24" "1997-09-25"
#  [6] "1997-09-26" "1997-09-29" "1997-09-30" NA           NA          
# [11] NA           NA           NA           NA           NA          
# [16] NA          
dates[is.na(dates)] <- as.Date(x[is.na(dates)], format="%m/%d/%Y")
formats <- c("%m/%d/%Y", "%d/%m/%Y", "%Y/%m/%d")
dates <- as.Date(rep(NA, length(x)))
for (fmt in formats) {
  nas <- is.na(dates)
  dates[nas] <- as.Date(x[nas], format=fmt)
}
dates
#  [1] "1997-09-19" "1997-09-22" "1997-09-23" "1997-09-24" "1997-09-25"
#  [6] "1997-09-26" "1997-09-29" "1997-09-30" NA           NA          
# [11] NA           NA           NA           NA           NA          
# [16] NA          
as.integer(Sys.Date())
# [1] 17787
Sys.Date() - 17787
# [1] "1970-01-01"
x[9]    # the first integer-looking element
# [1] "35440"
dates[1] - as.integer(x[9])
# [1] "1900-09-08"
nas <- is.na(dates)
dates[nas] <- as.Date(as.integer(x[nas]), origin="1900-01-01")
dates
#  [1] "1997-09-19" "1997-09-22" "1997-09-23" "1997-09-24" "1997-09-25"
#  [6] "1997-09-26" "1997-09-29" "1997-09-30" "1997-01-12" "1997-02-12"
# [11] "1997-03-12" "1997-06-12" "1997-07-12" "1997-08-12" "1997-09-12"
# [16] "1997-10-12"