14 votos

Convertir un campo de cadena en un campo de fecha en QGIS

En QGIS tengo una capa con puntos que representan los accidentes de tráfico mortales y el campo "dates_14_D" contiene su fecha pero su tipo es cadena. Me gustaría convertir este campo de cadena en un campo de fecha pero el botón OK está inactivo. ¿Cuál es el problema?

enter image description here

1 votos

¿Qué dice cuando hace clic en "más información"?

0 votos

Creo que el formato de la fecha es incorrecto; QGIS espera algo como 'YYYY-MM-DD'.

0 votos

Error de análisis: Error de evaluación: La conversión " % 1 " no fue posible.

20voto

Mat Puntos 196

Me sorprende no haber visto esto antes. Tal vez estoy pasando por alto algo obvio :)

Aunque utilizas una localización diferente a la mía, estás utilizando el mismo formato de fecha que yo en el Reino Unido, dd/MM/yyyy . Me da un error ligeramente diferente (en QGIS 2.16.1) pero no le gusta ese formato de fecha.

Se puede evitar esto creando un corto python script en la pestaña del editor de funciones del editor de expresiones.

  • Vaya a la pestaña del editor de funciones en el editor de expresiones
  • Crear una nueva función ( New file botón)
  • pegue lo siguiente en la ventana de código. Es posible que se produzcan errores de indentación, por lo que se debe volver a indentar manualmente con espacios si es necesario
  • pulse en Load para guardar los cambios
  • volver a la pestaña de expresión
  • busque en el apartado de python, ahora debería ver una función llamada parse_date_dmy

from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import QDate

@qgsfunction(args="auto", group='Python')
def parse_date_dmy(fromval, feature, parent):
    return QDate.fromString(fromval, 'dd/MM/yyyy')

Si utiliza QGIS 3.# y obtiene un error sobre PyQt4, entonces utilice PyQt5, es decir, sustituya la línea 3 por

...
from PyQt5.QtCore import QDate
...

A continuación, puede introducir una expresión como la siguiente, utilizando su nombre de campo :

parse_date_dmy("mydate") 

Si todo está bien, deberías ver algo como esto...

enter image description here

0 votos

Muchas gracias por su detallada respuesta. Ha funcionado. Pero, para algunas fechas, el resultado fue nulo. ¿Hay alguna explicación?

1 votos

Pruebe con d/M/aaaa como su cadena de formato (véase Especificación de la cadena de formato de fecha de Qt aunque hay que tener en cuenta que se trata de una página de Qt5). Lo he probado en días y meses con cifras simples y dobles y parece que funciona bien. Si eso funciona actualizaré mi respuesta.

0 votos

La primera vez que ejecuté este procedimiento, el formato de la fecha era d/M/aaaa. He intentado ejecutarlo de nuevo con el formato d/M/aaaa y el resultado de algunos registros fue nulo, tal y como se mencionó anteriormente. Además, lo he ejecutado con el formato dd/MM/aaaa y el resultado ha sido que todos los registros eran nulos. ¿He hecho algo mal?

6voto

thymaro Puntos 127

No sé cómo era en 2016, pero a partir de QGIS 3.10, esto está implementado en las funciones disponibles en QGIS en el editor de expresiones o en la calculadora de campos. La documentación de la derecha (en el diálogo de la calculadora de campos) te da la solución de:

to_date("MyDateFieldNameWithDatesAsStrings" , 'dd/MM/yyyy')

y golpear Ok . Adapte el "formato" al presente en su tabla de atributos. Por ejemplo, si sus fechas son algo así como 07.3.03 El formato correcto sería dd.M.yy *. Preste atención a las mayúsculas, ya que el símbolo m significa "minutos" y M significa "meses".

Este no es un formato que nadie debería utilizar. Si recibe un archivo con ese formato, hable con el superior del remitente. Esto no se sostiene.

1 votos

Debo añadir, que aunque pases 'dd/MM/yyyy' como parámetro, QGIS mostrará la fecha en yyyy-MM-dd (ya que es lo que entiende como formato de "fecha")

2voto

C. Esparza Puntos 131

Una actualización para QGIS 3 de la respuesta cristalina de @Steven Kay

Puede evitarlo creando un breve script en la pestaña del editor de funciones del editor de expresiones.

  • Vaya a la pestaña del editor de funciones en el editor de expresiones
  • Crear una nueva función ( New file botón)
  • pegue lo siguiente en la ventana de código. Es posible que se produzcan errores de indentación, por lo que se debe volver a indentar manualmente con espacios si es necesario
  • pulse en Load para guardar los cambios
  • volver a la pestaña de expresión
  • busque en el apartado de python, ahora debería ver una función llamada parse_date_dmy

from qgis.core import *
from qgis.gui import *
from PyQt5.QtCore import QDate

@qgsfunction(args="auto", group='Python')
def parse_date_dmy(fromval, feature, parent):
    return QDate.fromString(fromval, 'dd/MM/yyyy')      

A continuación, puede introducir una expresión como la siguiente, utilizando el nombre de su campo :-

parse_date_dmy("mydate") 

Si todo está bien, deberías ver algo como esto...

enter image description here

1voto

Ron Beyer Puntos 108

O simplemente utilice :

to_date( regexp_substr( "MAJ" , '/(\\d+$)' ) || '-' || regexp_substr( "MAJ" , '/(\\d+)/' ) || '-' || regexp_substr( "MAJ" , '^(\\d+)/' ) )

Con MAJ como campo de fecha (dd/MM/AAAA).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X