【问题标题】:[r]Change objects into date format: Character (0) is the outcome + How to deal with missing values[r]将对象更改为日期格式:字符(0)是结果+如何处理缺失值
【发布时间】:2016-05-05 01:35:56
【问题描述】:

我已经为这个问题搜索了堆栈溢出,并且有几个解决方案,但它们都不适合我,因为大多数解决方案只适用于短而完整的数据集。我有两列都是 481029 行长。它们都包含 dd.mm.YYYY 形式的日期。一个是订购日期,一个是交货日期。目的是计算差异(=deliverydate - orderdate)。问题是两列中都缺少一些日期。所以有时有交货日期但没有相应的订单日期,反之亦然。 1. 我该如何处理? 2. 如何将数据转换为日期形式?我的结果是:

ddate <- data.frame(data$deliveryDate)
> summary(ddate)
  data.deliveryDate 
?         : 39419  
2013-04-04:  5285  
2012-07-03:  5079  
1990-12-31:  4660  
2013-01-01:  4585  
2013-04-09:  4565  
(Other)   :417499  
> class(ddate)
[1] "data.frame"
> ddate <- factor()
> as.Date(ddate, format= "%d.%m.%Y")
character(0)
> mean(ddate-odate)
[1] NaN
Warning message:
In Ops.factor(ddate, odate) : ‘-’ ist nicht sinnvoll für Faktoren
> class(ddate)
[1] "factor"
> ddate[1]
[1] <NA>
as.POSIXct(ddate)
character(0)
> ddate[1]
[1] <NA>
Levels: 
> as.Date(ddate, format= "%d.%m.%Y")
character(0)
>class(odate)
[1] "factor"
> as.Date(ddate, format = "%d.%m.%Y")
character(0)
> class(ddate)
[1] "factor"
> ddate <- as.Date(ddate, format = "%d.%m.%Y")
> class(ddate)
[1] "Date"
> odate <- as.Date(odate, format = "%d.%m.%Y")
> summary(odate)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 NA      NA      NA      NA      NA      NA 
> head(odate)
character(0)
> mean(ddate-odate)
Time difference of NaN days
> ddate
character(0)
> str(ddate)
Class 'Date'  num(0) 
> str(odate)
Class 'Date'  num(0) 
> difftime(ddate,odate, units = ("days"))
Time difference of  days

我希望这不会太混乱和混乱。我只是尝试了很多东西,但我不明白。结果总是 NA 或类似的东西...... 谢谢大家!

【问题讨论】:

  • 日期变量已转换为因子。通过read.csv 或朋友读取数据时使用 as.is=TRUE。然后它们将作为字符读入,您可以应用 as.Date 函数。
  • Change to date format的可能重复
  • 如果你正确格式化你的日期向量,你可能想使用difftime(datevector2, datevector1)
  • 谢谢lmo和Phann!

标签: r date


【解决方案1】:

首先,按照 lmo 的建议将所有列读取为字符。

来到你的第一个问题,你可以摆脱 ?使用这个:

data$deliveryDate <- ifelse(data$deliveryDate == '?',NA,data$deliveryDate)

data$orderDate <- ifelse(data$orderDate == '?',NA,data$orderDate)

indices <- complete.cases(data)

final.data <- data[indices,]

如果你应用这个东西,只有那些行会出现在数据集final.data 中,它们同时具有交货日期和订单日期。

这里不需要在 as.Date 中指定格式。

另外,如果您正确显示了 deliveryDate 值,则它不是 dd.mm.YYYY 格式

最后,用Phann的建议找出不同之处

更新:

这就是你需要编写的代码:

## now, no need to check for '?' as it will be treated as NA .
data<-read.table("datatxt.txt", header=TRUE, sep = ";", stringsAsFactors = F, na.strings='?') 

final_data <- data[complete.cases(data),]

final_data$deliveryDate <- as.Date(final_data$deliveryDate)

final_data$orderDate <- as.Date(final_data$orderDate)

在此之后,您可以应用剩余的操作。

如果需要效率,可以使用这段代码:

library(data.table)
## now, no need to check for '?' as it will be treated as NA .
data<-fread("datatxt.txt", na.strings='?') 

final_data <- data[complete.cases(data),]

final_data[,deliveryDate := as.Date(deliveryDate)]

final_data[,orderDate := as.Date(orderDate)]

【讨论】:

  • 首先谢谢您!我现在已经阅读了 .txt 数据,它现在保持字符形式,并没有更改为因子。那挺好的。我不必在 as.Date 中指定格式是什么意思?当我用 Excel 打开它时,会显示 dd.mm.YYYY 格式。我必须使用 as.Date(file, format ="%Y-%m-%d") 吗?你觉得这里的格式是 YYYY-mm-dd 吗?
  • 我还有一个问题:data$deliveryDate 的某些值是错误的。他们将 31.12.1990 显示为不能与 2012 年订单相同的日期。我如何告诉 r 也忽略 data$deliveryDate = 31.12.1990 的这些行?
  • Excel 可能会以自己的方式对其进行格式化。使用编辑器查看数据,您将看到数据是如何存储的。如果日期是标准格式,则不必指定,否则必须指定。您可以排除日期,例如with:data[which(data$deliveryDate &gt; as.Date("2000-01-01)), ],它只返回deliveryDate大于2000年的这些行。
  • @Vinc 回答你的第一个问题,因为它是 R 使用的默认格式,你不需要指定它。并且格式不包含任何点。因为当您在提到的输出中应用 summary() 函数时,那里没有出现点。
  • @Phann 的绝对正确建议。
【解决方案2】:

感谢大家的帮助。这是最终结果的样子:

 > data<-read.table("datatxt.txt", header=TRUE, sep = ";", stringsAsFactors = F, na.strings='?') # read the file and treat all "?" as NA 
> dates <- data[,c('orderDate','deliveryDate')] # only use the orderDate and deliveryDate columns from the data set "data" 

> final_dates <- dates[complete.cases(dates),] # only use the rows which are complete in both columns
> final_dates$deliveryDate <- as.Date(final_dates$deliveryDate) #define as Date
> final_dates$orderDate <- as.Date(final_dates$orderDate) # define as Date
> deliverytime <- difftime(final_dates$deliveryDate, final_dates$orderDate, units = c("days")) # calculate the difference of the dates in days
> deliverytime_wo_1990 <- subset(deliverytime, deliverytime>0) # only show positive days. To get rid of wrong data where the deliverydate is before the orderdate. 
> mean(deliverytime_wo_1990) # finally it is possible to calculate for example the mean!

谢谢大家。我终于成功了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-04
    • 2021-05-07
    • 2019-10-04
    • 2014-04-03
    • 1970-01-01
    • 2018-06-22
    相关资源
    最近更新 更多