Jak przekonwertować pole ciągu na pole daty

10

Mam warstwę z punktami, które reprezentują śmiertelne wypadki drogowe, a pole „daty_14_D” zawiera ich datę, ale jego typ to ciąg znaków. Chciałbym przekonwertować to pole ciągu na pole daty, ale przycisk OK jest nieaktywny. Jaki jest problem? Używam QGis. Spójrz na poniższe zdjęciewprowadź opis zdjęcia tutaj

ilias m
źródło
1
Co to znaczy, kiedy klikniesz „więcej informacji”?
Matthias Kuhn
Myślę, że format daty jest nieprawidłowy; QGIS oczekuje czegoś w rodzaju „RRRR-MM-DD”.
ArMoraer
Błąd analizy: Błąd oceny: Konwersja „% 1” nie była możliwa.
ilias m
Przekształciłem format tak, jak @ArMoraer powiedział i powtórzyłem procedurę, ale ponownie przycisk OK jest nieaktywny.
ilias m

Odpowiedzi:

14

Dziwię się, że nie widziałem tego wcześniej. Może przeoczyłem coś oczywistego :)

Chociaż używasz innej lokalizacji dla mnie, używasz tego samego formatu daty, co ja w Wielkiej Brytanii, dd / MM / rrrr. Otrzymuję nieco inny błąd (w QGIS 2.16.1), ale nie podoba mu się ten format daty.

Można to obejść, tworząc krótki skrypt python w zakładce edytora funkcji edytora wyrażeń.

  • Przejdź do zakładki edytora funkcji w edytorze wyrażeń
  • Utwórz nową funkcję (przycisk „Nowy plik”)
  • wklej następujące w oknie kodu. Mogą pojawić się błędy wcięcia, więc w razie potrzeby ręcznie powtórz wcięcie spacjami
  • kliknij przycisk „Załaduj”, aby zapisać zmiany
  • wróć do zakładki wyrażenia
  • spójrz pod nagłówek pytona, powinien teraz zobaczyć funkcję o nazwie 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')

Jeśli używasz QGIS 3. # i pojawia się błąd dotyczący PyQt4, zamiast tego użyj PyQt5, tzn. Zamień wiersz 3 na

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

Następnie możesz wprowadzić takie wyrażenie, używając nazwy pola: -

parse_date_dmy("mydate") 

Jeśli wszystko jest w porządku, powinieneś zobaczyć coś takiego ...

wprowadź opis zdjęcia tutaj

Steven Kay
źródło
Bardzo dziękuję za szczegółową odpowiedź. Zadziałało. Ale w przypadku niektórych dat wynik był zerowy. Czy jest jakieś wytłumaczenie?
ilias m
1
spróbuj d / M / rrrr jako ciąg formatu (patrz specyfikacja ciągu formatu daty Qt , chociaż zauważ, że jest to strona Qt5). Testowałem to w dniach i miesiącach z pojedynczymi i podwójnymi liczbami i wydawało się, że działa OK. Jeśli to zadziała, zaktualizuję moją odpowiedź.
Steven Kay,
Przy pierwszym uruchomieniu tej procedury formatem daty był d / M / rrrr. Próbowałem uruchomić to ponownie w formacie d / M / rrrr, a wynik niektórych rekordów był zerowy, jak wspomniano powyżej. Ponadto uruchamiam to w formacie dd / MM / rrrr i wynik był taki, że wszystkie rekordy były zerowe. Czy zrobiłem coś źle?
ilias m
1

Lub po prostu użyj:

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

Z MAJ jako polem daty (dd / MM / RRRR).

J. Sabatier
źródło
1

Aktualizacja QGIS 3 krystalicznie czystej odpowiedzi autorstwa @Steven Kay

Można to obejść, tworząc krótki skrypt python w zakładce edytora funkcji edytora wyrażeń.

  • Przejdź do zakładki edytora funkcji w edytorze wyrażeń
  • Utwórz nową funkcję (przycisk „Nowy plik”)
  • wklej następujące w oknie kodu. Mogą pojawić się błędy wcięcia, więc w razie potrzeby ręcznie powtórz wcięcie spacjami
  • kliknij przycisk „Załaduj”, aby zapisać zmiany
  • wróć do zakładki wyrażenia
  • spójrz pod nagłówek pytona, powinien teraz zobaczyć funkcję o nazwie 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')

Następnie możesz wprowadzić takie wyrażenie, używając nazwy pola: -

parse_date_dmy("mydate") 

Jeśli wszystko jest w porządku, powinieneś zobaczyć coś takiego ...

wprowadź opis zdjęcia tutaj

Roberto Zeeland
źródło
1

Nie wiem, jak to było w 2016 roku, ale od QGIS 3.10 jest to zaimplementowane w dostępnych funkcjach QGIS w edytorze wyrażeń lub kalkulatorze polowym. Dokumentacja po prawej stronie (w oknie dialogowym obliczeń) daje rozwiązanie:

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

(białe znaki są opcjonalne) i naciśnij „OK”. Dostosuj „format” do obecnego w tabeli atrybutów. Na przykład, jeśli daty wyglądają mniej więcej tak 07.3.03, właściwym formatem będzie dd.M.yy*. Zwróć uwagę na wielkie litery, ponieważ symbol moznacza „minuty” i M„miesiące”.

  • To nie jest format, którego powinien używać każdy. Jeśli otrzymasz plik w tym formacie, skontaktuj się z przełożonym nadawcy. To nie wytrzyma!
tymianek
źródło