Teken omzetten in klasse Datum

Ik heb een dataframe met een karakterkolom met datums.

Als ik as.Dategebruik, worden de meeste van mijn datums correct geparseerd, op enkele gevallen na. Het onderstaande voorbeeld laat je hopelijk zien wat er aan de hand is.

# my attempt to parse the string to Date -- uses the stringr package
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
                str_locate(prods.all$Date, " ")[1]-1), 
                "%m/%d/%Y")
# grab two rows to highlight my issue
temp <- prods.all[c(1925:1926), c(1,8)]
temp
#                    Date      Date2
# 1925  10/9/2009 0:00:00 2009-10-09
# 1926 10/15/2009 0:00:00 0200-10-15

Zoals je kunt zien, is het jaartal van sommige datums onjuist. Het patroon lijkt op te treden wanneer de dag dubbele cijfers heeft.

Alle hulp die u kunt bieden, wordt zeer op prijs gesteld.


Antwoord 1, autoriteit 100%

Je maakt het misschien te ingewikkeld, is er een reden waarom je het stringr-pakket nodig hebt? U kunt as.Dateen het argument formatgebruiken om de invoer-indeling van uw tekenreeks te specificeren.

df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
 as.Date(df$Date, format =  "%m/%d/%Y %H:%M:%S")
 # [1] "2009-10-09" "2009-10-15"

Let op het gedeelte Detailsvan ?as.Date:

Tekenreeksen worden verwerkt voor zover nodig voor het opgegeven formaat: eventuele volgtekens worden genegeerd

Dit werkt dus ook:

as.Date(df$Date, format =  "%m/%d/%Y)
# [1] "2009-10-09" "2009-10-15"

Alle conversiespecificaties die kunnen worden gebruikt om het invoer formatte specificeren, zijn te vinden in de sectie Detailsin ?strptime. Zorg ervoor dat de volgordevan de conversiespecificatie en eventuele scheidingstekensexact overeenkomen met het formaat van uw invoer-tekenreeks.


Meer in het algemeen en als je ook de tijdcomponent nodig hebt, gebruik dan as.POSIXctof strptime:

as.POSIXct(df$Date, "%m/%d/%Y %H:%M:%S")    
strptime(df$Date, "%m/%d/%Y %H:%M:%S")

Ik vermoed waar uw werkelijke gegevens naar zouden kunnen kijken op basis van de gedeeltelijke resultaten die u geeft.


Antwoord 2, autoriteit 98%

De gemakkelijkste manier is om smeermiddel te gebruiken:

library(lubridate)
prods.all$Date2 <- mdy(prods.all$Date2)

Deze functie retourneert automatisch objecten van de klasse POSIXcten werkt met factoren of tekens.


Antwoord 3, autoriteit 2%

library(lubridate)
als je datumnotatie zo is ’24/04/2017 05:35:00′, verander het dan zoals hieronder
prods.all$Date2<-gsub("/","-",prods.all$Date2)
verander dan het datumformaat
parse_date_time(prods.all$Date2, orders="mdy hms")

Other episodes