วิธีการแปลงฟิลด์สตริงเป็นฟิลด์วันที่


10

ฉันมีเลเยอร์ที่มีจุดซึ่งแสดงถึงอุบัติเหตุบนท้องถนนที่ร้ายแรงและฟิลด์ "date_14_D" มีวันที่ แต่ประเภทของมันคือสตริง ฉันต้องการแปลงฟิลด์สตริงเป็นฟิลด์วันที่ แต่ปุ่มตกลงไม่ทำงาน มีปัญหาอะไร? ฉันใช้ QGis ดูภาพด้านล่างป้อนคำอธิบายรูปภาพที่นี่


1
มันพูดอะไรเมื่อคุณคลิกที่ "ข้อมูลเพิ่มเติม"?
Matthias Kuhn

ฉันคิดว่ารูปแบบวันที่ไม่ถูกต้อง QGIS คาดหวังบางอย่างเช่น 'YYYY-MM-DD'
ArMoraer

ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาด Eval: การแปลง "% 1" เป็นไปไม่ได้
ilias m

ฉันแปลงรูปแบบเช่น @ArMoraer บอกว่าฉันทำขั้นตอนซ้ำแล้วซ้ำอีก แต่ปุ่มตกลงไม่ทำงาน
ilias m

คำตอบ:


14

ฉันประหลาดใจที่ฉันไม่เคยเห็นสิ่งนี้มาก่อน บางทีฉันอาจมองเห็นสิ่งที่ชัดเจน :)

แม้ว่าคุณจะใช้ภาษาอื่นกับฉันคุณกำลังใช้รูปแบบวันที่เดียวกับที่ฉันทำในสหราชอาณาจักร dd / MM / yyyy ฉันพบข้อผิดพลาดเล็กน้อย (ใน QGIS 2.16.1) แต่ไม่ชอบรูปแบบวันที่ดังกล่าว

คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการสร้างสคริปต์ไพ ธ อนสั้น ๆ ในแท็บฟังก์ชั่นแก้ไขของตัวแก้ไขนิพจน์

  • ไปที่แท็บฟังก์ชั่นแก้ไขในตัวแก้ไขการแสดงออก
  • สร้างฟังก์ชั่นใหม่ (ปุ่ม "ไฟล์ใหม่")
  • วางสิ่งต่อไปนี้ลงในหน้าต่างรหัส คุณอาจได้รับข้อผิดพลาดการเยื้องดังนั้นเยื้องด้วยตนเองด้วยช่องว่างหากจำเป็น
  • คลิกที่ปุ่ม "โหลด" เพื่อบันทึกการเปลี่ยนแปลง
  • สลับกลับไปที่แท็บนิพจน์
  • ดูใต้ส่วนหัวหลามตอนนี้ควรเห็นฟังก์ชั่นชื่อ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')

หากคุณใช้ QGIS 3 # และรับข้อผิดพลาดเกี่ยวกับ PyQt4 ให้ใช้ PyQt5 แทนเช่นแทนที่บรรทัด 3 ด้วย

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

จากนั้นคุณสามารถป้อนนิพจน์เช่นนั้นโดยใช้ชื่อฟิลด์ของคุณ: -

parse_date_dmy("mydate") 

หากทุกอย่างดีคุณควรเห็นสิ่งนี้ ...

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณมากสำหรับคำตอบโดยละเอียดของคุณ มันได้ผล แต่สำหรับบางวันผลที่ได้ก็จะว่างเปล่า มีคำอธิบายอะไรบ้าง?
ilias m

1
ลองd / M / yyyyเป็นสตริงรูปแบบของคุณ (ดูข้อมูลจำเพาะสตริงรูปแบบวันที่ Qtแม้ว่าโปรดทราบว่านี่คือหน้า Qt5) ฉันทดสอบในวันและเดือนด้วยตัวเลขเดี่ยวและคู่และดูเหมือนว่าจะทำงานได้ หากได้ผลฉันจะอัปเดตคำตอบของฉัน
Steven Kay

ครั้งแรกที่ฉันเรียกใช้โพรซีเดอร์นี้รูปแบบของวันที่คือ d / M / yyyy ฉันพยายามเรียกใช้งานด้วยรูปแบบ d / M / yyyy อีกครั้งและผลลัพธ์ของบางระเบียนเป็นโมฆะตามที่กล่าวไว้ข้างต้น นอกจากนี้ฉันรันสิ่งนี้ด้วยรูปแบบ dd / MM / yyyy และผลลัพธ์ก็คือว่าระเบียนทั้งหมดเป็นโมฆะ ฉันทำผิดไปแล้วใช่ไหม
ilias m

1

หรือเพียงใช้:

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

ด้วย MAJ เป็นฟิลด์วันที่ของคุณ (dd / MM / YYYY)


1

การอัปเดตสำหรับ QGIS 3 ของคำตอบที่ชัดใสโดย @Steven Kay

คุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการสร้างสคริปต์ไพ ธ อนสั้น ๆ ในแท็บฟังก์ชั่นแก้ไขของตัวแก้ไขนิพจน์

  • ไปที่แท็บฟังก์ชั่นแก้ไขในตัวแก้ไขการแสดงออก
  • สร้างฟังก์ชั่นใหม่ (ปุ่ม "ไฟล์ใหม่")
  • วางสิ่งต่อไปนี้ลงในหน้าต่างรหัส คุณอาจได้รับข้อผิดพลาดการเยื้องดังนั้นเยื้องด้วยตนเองด้วยช่องว่างหากจำเป็น
  • คลิกที่ปุ่ม "โหลด" เพื่อบันทึกการเปลี่ยนแปลง
  • สลับกลับไปที่แท็บนิพจน์
  • ดูใต้ส่วนหัวหลามตอนนี้ควรเห็นฟังก์ชั่นชื่อ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')

จากนั้นคุณสามารถป้อนนิพจน์เช่นนั้นโดยใช้ชื่อฟิลด์ของคุณ: -

parse_date_dmy("mydate") 

หากทุกอย่างดีคุณควรเห็นสิ่งนี้ ...

ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันไม่รู้ว่ามันเป็นอย่างไรในปี 2559 แต่จาก QGIS 3.10 สิ่งนี้ถูกนำไปใช้ในฟังก์ชั่นที่มีอยู่ใน QGIS ในเครื่องมือแก้ไขการแสดงออกหรือเครื่องคำนวณภาคสนาม เอกสารทางด้านขวา (ในกล่องโต้ตอบการคำนวณภาคสนาม) จะช่วยให้คุณแก้ปัญหาของ:

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

(ช่องว่างเป็นทางเลือก) และกด "ตกลง" ปรับ "รูปแบบ" เป็นสิ่งที่มีอยู่ในตารางแอตทริบิวต์ของคุณ ตัวอย่างเช่นหากวันที่ของคุณดูเหมือนสิ่ง07.3.03ที่ถูกต้องรูปแบบที่ถูกต้องสำหรับนั้นจะเป็นdd.M.yy* ให้ความสนใจกับตัวพิมพ์ใหญ่เนื่องจากสัญลักษณ์mย่อมาจาก "นาที" และMหมายถึง "เดือน"

  • นี่ไม่ใช่รูปแบบที่ทุกคนควรใช้ หากคุณได้รับไฟล์ที่มีรูปแบบดังกล่าวโปรดคุยกับผู้ส่งที่ดีกว่า สิ่งนี้จะไม่เกิดขึ้น!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.