Como converter um campo de seqüência de caracteres em um campo de data

9

Eu tenho uma camada com pontos que representam acidentes fatais na estrada e o campo "datas_14_D" contém a data deles, mas seu tipo é string. Gostaria de converter esse campo de string em campo de data, mas o botão OK está inativo. Qual é o problema? Eu uso QGis. Veja a imagem abaixoinsira a descrição da imagem aqui

ilias m
fonte
11
O que diz quando você clica em "mais informações"?
Matthias Kuhn
Eu acho que o formato da data está errado; O QGIS espera algo como 'AAAA-MM-DD'.
ArMoraer 28/09/16
Erro de análise: erro de avaliação: a conversão "% 1" não foi possível.
Ilias m
Eu converti o formato como o @ArMoraer disse que repeti o procedimento, mas novamente o botão OK está inativo.
ilias m 28/09/16

Respostas:

12

Estou surpreso por não ter visto isso antes. Talvez eu esteja ignorando algo óbvio :)

Embora você esteja usando um local diferente para mim, está usando o mesmo formato de data que eu no Reino Unido, dd / MM / aaaa. Eu recebo um erro ligeiramente diferente (no QGIS 2.16.1), mas ele não gosta desse formato de data.

Você pode contornar isso criando um script python curto na guia do editor de funções do editor de expressões.

  • Vá para a guia do editor de funções no editor de expressões
  • Crie uma nova função (botão "Novo arquivo")
  • cole o seguinte na janela de código. Você pode obter erros de recuo, então recue manualmente com espaços, se necessário
  • clique no botão "Carregar" para salvar as alterações
  • volte para a guia expressão
  • olhe sob o cabeçalho python, agora deve ver uma função chamada 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')

Você pode inserir uma expressão assim, usando o nome do seu campo: -

parse_date_dmy("mydate") 

Se tudo estiver bem, você deve ver algo assim ...

insira a descrição da imagem aqui

Steven Kay
fonte
Muito obrigado pela sua resposta detalhada. Funcionou. Mas, para algumas datas, o resultado foi nulo. Existe alguma explicação?
ilias m 28/09/16
11
tente d / M / aaaa como sua string de formato (consulte Especificação da string de formato de data Qt , embora observe que esta é uma página Qt5). Eu o testei em dias e meses com números únicos e duplos e parecia funcionar bem. Se isso funcionar, atualizarei minha resposta.
Steven Kay
A primeira vez que executo esse procedimento, o formato da data era d / M / aaaa. Tentei executar isso com o formato d / M / aaaa novamente e o resultado de alguns registros foi nulo, como mencionado acima. Além disso, eu corro isso com o formato dd / MM / aaaa e o resultado foi que todos os registros foram nulos. Eu fiz algo errado?
ilias m
1

Ou simplesmente use:

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

Com MAJ como seu campo de data (dd / MM / AAAA).

J. Sabatier
fonte
1

Uma atualização para o QGIS 3 da resposta cristalina de @Steven Kay

Você pode contornar isso criando um script python curto na guia do editor de funções do editor de expressões.

  • Vá para a guia do editor de funções no editor de expressões
  • Crie uma nova função (botão "Novo arquivo")
  • cole o seguinte na janela de código. Você pode obter erros de recuo, então recue manualmente com espaços, se necessário
  • clique no botão "Carregar" para salvar as alterações
  • volte para a guia expressão
  • olhe sob o cabeçalho python, agora deve ver uma função chamada 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')

Você pode inserir uma expressão assim, usando o nome do seu campo: -

parse_date_dmy("mydate") 

Se tudo estiver bem, você deve ver algo assim ...

insira a descrição da imagem aqui

Roberto Zeeland
fonte