Cara mengonversi bidang string ke bidang tanggal


9

Saya memiliki lapisan dengan titik-titik yang mewakili kecelakaan jalan fatal dan bidang "Date_14_D" berisi tanggal mereka tetapi tipenya adalah string. Saya ingin mengonversi bidang string ini menjadi bidang tanggal tetapi tombol OK tidak aktif. Apa masalahnya? Saya menggunakan QGis. Lihat gambar di bawah inimasukkan deskripsi gambar di sini


1
Apa isinya ketika Anda mengklik "info lebih lanjut"?
Matthias Kuhn

Saya pikir format tanggal salah; QGIS mengharapkan sesuatu seperti 'YYYY-MM-DD'.
ArMoraer

Kesalahan Parse: Kesalahan Eval: Konversi "% 1" tidak dimungkinkan.
ilias m

Saya mengonversi format seperti @ArMoraer berkata saya mengulangi prosedur tetapi sekali lagi tombol OK tidak aktif.
ilias m

Jawaban:


13

Saya terkejut saya belum pernah melihat ini sebelumnya. Mungkin saya mengabaikan sesuatu yang jelas :)

Meskipun Anda menggunakan lokal yang berbeda dengan saya, Anda menggunakan format tanggal yang sama seperti yang saya lakukan di Inggris, hh / MM / tttt. Saya mendapatkan kesalahan yang sedikit berbeda (pada QGIS 2.16.1) tetapi tidak suka format tanggal itu.

Anda bisa menyiasatinya dengan membuat skrip python pendek di tab editor fungsi dari editor ekspresi.

  • Buka tab editor fungsi di editor ekspresi
  • Buat fungsi baru (tombol "File baru")
  • rekatkan yang berikut ke jendela kode. Anda mungkin mendapatkan kesalahan indentasi, jadi inden indentasi dengan spasi secara manual jika diperlukan
  • klik tombol "Muat" untuk menyimpan perubahan
  • beralih kembali ke tab ekspresi
  • lihat di bawah judul python, seharusnya sekarang melihat fungsi yang disebut 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')

Anda kemudian dapat memasukkan ekspresi seperti itu, menggunakan nama bidang Anda: -

parse_date_dmy("mydate") 

Jika semuanya baik-baik saja, Anda harus melihat sesuatu seperti ini ...

masukkan deskripsi gambar di sini


Terima kasih banyak atas jawaban terperinci Anda. Itu berhasil. Tetapi, untuk beberapa tanggal, hasilnya adalah nol. Apakah ada penjelasan?
ilias m

1
coba d / M / yyyy sebagai string format Anda (lihat Spesifikasi format string tanggal Qt , meskipun perhatikan bahwa ini adalah halaman Qt5). Saya mengujinya pada hari dan bulan dengan angka tunggal dan ganda dan sepertinya berhasil OK. Jika berhasil, saya akan memperbarui jawaban saya.
Steven Kay

Pertama kali saya menjalankan prosedur ini, format tanggal adalah d / M / yyyy. Saya telah mencoba menjalankan ini dengan format d / M / yyyy lagi dan hasil dari beberapa catatan adalah nol seperti yang disebutkan di atas. Selain itu, saya menjalankan ini dengan format dd / MM / yyyy dan hasilnya adalah semua catatan adalah nol. Apakah saya salah melakukan kesalahan?
ilias m

1

Atau cukup gunakan:

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

Dengan MAJ sebagai bidang tanggal Anda (dd / MM / YYYY).


1

Pembaruan untuk QGIS 3 dari jawaban sebening kristal oleh @Steven Kay

Anda bisa menyiasatinya dengan membuat skrip python pendek di tab editor fungsi dari editor ekspresi.

  • Buka tab editor fungsi di editor ekspresi
  • Buat fungsi baru (tombol "File baru")
  • rekatkan yang berikut ke jendela kode. Anda mungkin mendapatkan kesalahan indentasi, jadi inden indentasi dengan spasi secara manual jika diperlukan
  • klik tombol "Muat" untuk menyimpan perubahan
  • beralih kembali ke tab ekspresi
  • lihat di bawah judul python, seharusnya sekarang melihat fungsi yang disebut 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')

Anda kemudian dapat memasukkan ekspresi seperti itu, menggunakan nama bidang Anda: -

parse_date_dmy("mydate") 

Jika semuanya baik-baik saja, Anda harus melihat sesuatu seperti ini ...

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.