在数据drame上应用udfs

时间:2017-05-31 11:05:34

标签: r apply

我有以下数据框df,其中包含两列日期。

             pnr_date       departuredate
1 06/10/2014 00:00:00 06/11/2014 00:00:00
2 12/06/2013 00:00:00 12/06/2013 00:00:00
3 12/03/2013 00:00:00 12/03/2013 00:00:00
4 03/11/2012 00:00:00 03/12/2012 00:00:00
5 08/29/2011 00:00:00 09/01/2011 00:00:00
6 03/10/2012 00:00:00 03/10/2012 00:00:00

我写了两个简单的函数。一个计算两个日期之间的天数,一个查明哪一天(星期一,星期二等)是给定日期。

anticipation<-function(date1,date2){

  ForDate1<-strsplit(date1," ")[[1]][1]
  ForDate2<-strsplit(date2," ")[[1]][1]

  as.numeric(as.POSIXct(parse_date_time(ForDate2,"mdy"))-as.POSIXct(parse_date_time(ForDate1,"mdy")))

}

wDay<-function(date){

  ForDate<-strsplit(date," ")[[1]][1]
  weekdays(as.Date(parse_date_time(ForDate,"mdy")))

}

他们都使用库lubridate

有没有办法在数据框上使用apply()或类似的方法来计算每行两个日期之间的天数(使用函数anticipation()),还可以找到确切的日期对于第二列中的所有日期(使用函数wDay())?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

要计算天数差异,请使用

df$days.between <- as.numeric(
    difftime(
        strptime(df$pnr_date, format = "%m/%d/%Y %H:%M:%S"),
        strptime(df$departuredate, format = "%m/%d/%Y %H:%M:%S"),
        units = "days"
    )
)

e.g。

as.numeric(
    difftime(
        strptime("09/01/2011 00:00:00", format = "%m/%d/%Y %H:%M:%S"),
        strptime("08/29/2011 00:00:00", format = "%m/%d/%Y %H:%M:%S"),
        units = "days"
    )
)
[1] 3

要获得工作日,请使用

df$weekday <- weekdays(as.Date(df$departuredate))

e.g。

weekdays(as.Date("09/01/2011 00:00:00"))
[1] "Tuesday"

如果您需要非英文名称,则需要设置您的语言区域:

Sys.setlocale("LC_TIME", "de_DE")
[1] "de_DE"
weekdays(as.Date("09/01/2011 00:00:00"))
[1] "Dienstag"