Ik heb een dataframe met een karakterkolom met datums.
Als ik as.Date
gebruik, 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.Date
en het argument format
gebruiken 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 format
te 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.POSIXct
of 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 POSIXct
en 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")