Dize alanını tarih alanına dönüştürme


10

Ölümcül trafik kazalarını temsil eden noktaları olan bir katman var ve alan "dates_14_D" tarihlerini içerir, ancak türü dize. Bu dize alanını tarih alanına dönüştürmek istiyorum ancak Tamam düğmesi etkin değil. Sorun ne? QGis kullanıyorum. Aşağıdaki resme bakınresim açıklamasını buraya girin


1
"Daha fazla bilgi" yi tıkladığınızda ne diyor?
Matthias Kuhn

Tarih biçiminin yanlış olduğunu düşünüyorum; QGIS 'YYYY-AA-GG' gibi bir şey bekliyor.
ArMoraer

Ayrıştırma Hatası: Eval Hatası: "% 1" dönüşümü mümkün değildi.
ilias m

@ArMoraer gibi bir formatı dönüştürdüm ve prosedürü tekrarladım ama yine OK düğmesi aktif değil.
ilias m

Yanıtlar:


14

Bunu daha önce görmediğime şaşırdım. Belki bariz bir şeye bakmıyorum :)

Benim için farklı bir yerel ayar kullanmanıza rağmen, İngiltere'de yaptığım tarih biçimini aynı gg / AA / yyyy kullanıyorsunuz. Biraz farklı bir hata alıyorum (QGIS 2.16.1'de) ama bu tarih biçiminden hoşlanmıyor.

İfade düzenleyicisinin işlev düzenleyicisi sekmesinde kısa bir python betiği oluşturarak bu sorunu çözebilirsiniz.

  • İfade düzenleyicideki işlev düzenleyici sekmesine gidin
  • Yeni bir işlev oluşturun ("Yeni dosya" düğmesi)
  • aşağıdakileri kod penceresine yapıştırın. Girinti hataları alabilirsiniz, bu nedenle gerekirse boşluklarla manuel olarak girinti yapın
  • değişiklikleri kaydetmek için "Yükle" düğmesine tıklayın
  • ifade sekmesine geri dön
  • python başlığının altına bakın, şimdi parse_date_dmy adlı bir işlev görmeli

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')

QGIS 3. # kullanıyorsanız ve PyQt4 hakkında bir hata alırsanız, bunun yerine PyQt5 kullanın, yani satır 3'ü

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

Daha sonra alan adınızı kullanarak böyle bir ifade girebilirsiniz: -

parse_date_dmy("mydate") 

Her şey yolundaysa, böyle bir şey görmelisin ...

resim açıklamasını buraya girin


Ayrıntılı cevabınız için çok teşekkürler. İşe yaradı. Ancak, bazı tarihler için sonuç boştu. Herhangi bir açıklama var mı?
ilias m

1
denemek d / M / yyyy biçim dizesi olarak (bkz Qt tarih biçimi dize spec bu Qt5 sayfa olduğunu not rağmen). Gün ve aylarda tek ve çift rakamlarla test ettim ve tamam gibi görünüyordu. Bu işe yararsa cevabımı güncelleyeceğim.
Steven Kay

Bu yordamı ilk kez çalıştırdığımda, tarihin biçimi d / M / yyyy idi. Bunu tekrar d / M / yyyy formatında çalıştırmayı denedim ve bazı kayıtların sonuçları yukarıda belirtildiği gibi boştu. Buna ek olarak, bunu dd / MM / yyyy biçiminde çalıştırıyorum ve sonuç tüm kayıtların boş olmasıydı. Yanlış mı yaptım?
ilias m

1

Veya şunu kullanın:

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

Tarih alanınız olarak MAJ ile (gg / AA / YYYY).


1

@Steven Kay kristal netliğinde cevabın QGIS 3 güncellemesi

İfade düzenleyicisinin işlev düzenleyicisi sekmesinde kısa bir python betiği oluşturarak bu sorunu çözebilirsiniz.

  • İfade düzenleyicideki işlev düzenleyici sekmesine gidin
  • Yeni bir işlev oluşturun ("Yeni dosya" düğmesi)
  • aşağıdakileri kod penceresine yapıştırın. Girinti hataları alabilirsiniz, bu nedenle gerekirse boşluklarla manuel olarak girinti yapın
  • değişiklikleri kaydetmek için "Yükle" düğmesine tıklayın
  • ifade sekmesine geri dön
  • python başlığının altına bakın, şimdi parse_date_dmy adlı bir işlev görmeli

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')

Daha sonra alan adınızı kullanarak böyle bir ifade girebilirsiniz: -

parse_date_dmy("mydate") 

Her şey yolundaysa, böyle bir şey görmelisin ...

resim açıklamasını buraya girin


1

2016'da neye benzediğini bilmiyorum, ancak QGIS 3.10'dan itibaren, bu ifade editöründe veya alan hesap makinesinde QGIS'deki mevcut işlevlerde uygulanmaktadır. Sağdaki belgeler (tarla iletişim kutusunda) size aşağıdakilerin çözümünü sunar:

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

(boşluk isteğe bağlıdır) ve "Tamam" a basın. "Biçimi" öznitelik tablonuzda bulunan biçime uyarlayın. Örneğin, tarihleriniz buna benziyorsa 07.3.03, bunun için doğru biçim dd.M.yy* olur. Büyük harflere dikkat edin, çünkü sembol m"dakika" ve M"ay" anlamına gelir.

  • Bu, herkesin kullanması gereken bir biçim değildir. Bu formatta bir dosya alırsanız, lütfen gönderenin amiriyle görüşün. Bu durmayacak!
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.