2010-11-02 25 views
7

Necesito convertir la fecha (formato m/d/y) en 3 columnas separadas en las que espero ejecutar un algoritmo. (Estoy intentando convertir mis fechas en Julian Day Numbers). Vi esta sugerencia para otro usuario para separar datos en múltiples columnas usando Oracle. Estoy usando R y estoy totalmente atascado sobre cómo codificar esto de manera apropiada. ¿A1, A2 ... representarían mis nuevos encabezados de columna, y cuál sería la diferencia de formato con la sección "establecer actualización"?Dividir datos de fecha (m/d/y) en 3 columnas separadas

update <tablename> set A1 = substr(ORIG, 1, 4), 
         A2 = substr(ORIG, 5, 6), 
         A3 = substr(ORIG, 11, 6), 
         A4 = substr(ORIG, 17, 5); 

Estoy tratando de mejorar mis habilidades en R pero no puedo entender esta ... cualquier ayuda es muy apreciada. Gracias por adelantado ... :)

Respuesta

9

dado una variable de texto x, así:

> x 
[1] "10/3/2001" 

a continuación:

> as.Date(x,"%m/%d/%Y") 
[1] "2001-10-03" 

lo convierte en un objeto de fecha. Entonces, si lo necesita:

> julian(as.Date(x,"%m/%d/%Y")) 
[1] 11598 
attr(,"origin") 
[1] "1970-01-01" 

le da una fecha juliana (relativa a 1970-01-01).

No trate lo subcadena ...

Ver ayuda (as.Date) por más.

6

los rápidos:

  1. Fecha juliana convertidores ya existen en la base de R, véase, por ejemplo help(julian).

  2. Un enfoque puede ser analizar la fecha como un POSIXlt y luego leer los componentes. Otras clases de fecha/hora y paquetes también funcionarán, pero hay algo que decir para la base R.

  3. El análisis de fechas como cadenas es casi siempre un mal enfoque.

Aquí se muestra un ejemplo:

datetxt <- c("2010-01-02", "2010-02-03", "2010-09-10") 
dates <- as.Date(datetxt) ## you could examine these as well 
plt <- as.POSIXlt(dates) ## now as POSIXlt types 
plt[["year"]] + 1900  ## years are with offset 1900 
#[1] 2010 2010 2010 
plt[["mon"]] + 1   ## and months are on the 0 .. 11 intervasl 
#[1] 1 2 9 
plt[["mday"]] 
#[1] 2 3 10 
df <- data.frame(year=plt[["year"]] + 1900, 
        month=plt[["mon"]] + 1, day=plt[["mday"]]) 
df 
# year month day 
#1 2010  1 2 
#2 2010  2 3 
#3 2010  9 10 

Y, por supuesto

julian(dates) 
#[1] 14611 14643 14862 
#attr(,"origin") 
#[1] "1970-01-01" 
+0

Para facilitar la lectura, los meses son más agradables que 'month.name [plt [[" mon "]] + 1]' –

+1

Claro, pero OP quería números para la conversión de Julian ... –

18

uso el método format() para Date objetos que separan las fechas en R. Uso de Dirk datetext, aquí es cómo iba a ir sobre la ruptura de una fecha en sus partes constituyentes:

datetxt <- c("2010-01-02", "2010-02-03", "2010-09-10") 
datetxt <- as.Date(datetxt) 
df <- data.frame(date = datetxt, 
       year = as.numeric(format(datetxt, format = "%Y")), 
       month = as.numeric(format(datetxt, format = "%m")), 
       day = as.numeric(format(datetxt, format = "%d"))) 

que da:

> df 
     date year month day 
1 2010-01-02 2010  1 2 
2 2010-02-03 2010  2 3 
3 2010-09-10 2010  9 10 

Tenga en cuenta lo que otros han dicho; puede obtener las fechas julianas sin dividir los diversos componentes de fecha. Agregué esta respuesta para mostrar cómo podrías separarte si lo necesitaras para otra cosa.

1

Hola Gavin: otra forma [usando su idea] es:

El-trama de datos que usaremos es oilstocks que contiene una variedad de variables relacionadas con los cambios en el tiempo de las reservas de petróleo y gas. Las variables son:

colnames(stocks) 
"bpV" "bpO" "bpC" "bpMN" "bpMX" "emdate" "emV" "emO" "emC" 
"emMN" "emMN.1" "chdate" "chV" "cbO" "chC" "chMN" "chMX" 

Una de las primeras cosas que hacer es cambiar el campo emdate, que es un vector de número entero, en un vector de fecha.

realdate<-as.Date(emdate,format="%m/%d/%Y") 

A continuación queremos dividir la columna emdate en tres columnas separadas que representan el mes, el día y el año con la idea que usted nos proporcionó.

> dfdate <- data.frame(date=realdate) 
year=as.numeric (format(realdate,"%Y")) 
month=as.numeric (format(realdate,"%m")) 
day=as.numeric (format(realdate,"%d")) 

ls() incluirá el individuo vectores, día, mes, año y dfdate. Ahora combine el dfdate, día, mes, año en el marco de datos original [stocks].

ostocks<-cbind(dfdate,day,month,year,stocks) 
colnames(ostocks) 

"date" "day" "month" "year" "bpV" "bpO" "bpC" "bpMN" "bpMX" "emdate" "emV" "emO" "emC" "emMN" "emMX" "chdate" "chV" 
"cbO" "chC" "chMN" "chMX" 

Resultados similares y también tengo fecha, día, mes, año como vectores separados fuera del df.

Cuestiones relacionadas