Cómo convertir un campo de cadena en un campo de fecha

9

Tengo una capa con puntos que representan los accidentes de tráfico mortales y el campo "date_14_D" contiene su fecha pero su tipo es string. Me gustaría convertir este campo de cadena en campo de fecha, pero el botón Aceptar está inactivo. ¿Cuál es el problema? Yo uso QGis. Mira la imagen de abajoingrese la descripción de la imagen aquí

ilias m
fuente
1
¿Qué dice cuando haces clic en "más información"?
Matthias Kuhn
Creo que el formato de fecha es incorrecto; QGIS espera algo así como 'AAAA-MM-DD'.
ArMoraer
Error de análisis: error de evaluación: la conversión "% 1" no fue posible.
ilias m
Convertí el formato como @ArMoraer dijo y repetí el procedimiento pero nuevamente el botón OK está inactivo.
ilias m

Respuestas:

13

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

Aunque está utilizando una configuración regional diferente para mí, está utilizando el mismo formato de fecha que yo en el Reino Unido, dd / MM / aaaa. Me sale un error ligeramente diferente (en QGIS 2.16.1) pero no me gusta ese formato de fecha.

Puede solucionar esto creando una secuencia de comandos de Python corta 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 (botón "Nuevo archivo")
  • pegue lo siguiente en la ventana de código. Puede obtener errores de sangría, por lo tanto, vuelva a sangrar manualmente con espacios si es necesario
  • haga clic en el botón "Cargar" para guardar los cambios
  • volver a la pestaña de expresión
  • mire debajo del encabezado 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')

Luego puede ingresar una expresión como esta, usando su nombre de campo: -

parse_date_dmy("mydate") 

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

ingrese la descripción de la imagen aquí

Steven Kay
fuente
Muchas gracias por tu respuesta detallada. Funcionó. Pero, para algunas fechas, el resultado fue nulo. ¿Hay alguna explicación?
ilias m
1
pruebe d / M / aaaa como su cadena de formato (vea la especificación de la cadena de formato de fecha Qt , aunque tenga en cuenta que esta es una página Qt5). Lo probé en días y meses con cifras simples y dobles y parecía funcionar bien. Si eso funciona, actualizaré mi respuesta.
Steven Kay
La primera vez que ejecuté este procedimiento, el formato de la fecha era d / M / aaaa. He intentado ejecutar esto con el formato d / M / aaaa nuevamente y el resultado de algunos registros fue nulo como se mencionó anteriormente. Además, ejecuté esto con el formato dd / MM / aaaa y el resultado fue que todos los registros eran nulos. ¿He hecho algo mal?
ilias m
1

O simplemente use:

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

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

J. Sabatier
fuente
1

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

Puede solucionar esto creando una secuencia de comandos de Python corta 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 (botón "Nuevo archivo")
  • pegue lo siguiente en la ventana de código. Puede obtener errores de sangría, por lo tanto, vuelva a sangrar manualmente con espacios si es necesario
  • haga clic en el botón "Cargar" para guardar los cambios
  • volver a la pestaña de expresión
  • mire debajo del encabezado 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')

Luego puede ingresar una expresión como esta, usando su nombre de campo: -

parse_date_dmy("mydate") 

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

ingrese la descripción de la imagen aquí

Roberto Zeeland
fuente