Cách chuyển đổi trường chuỗi thành trường ngày


9

Tôi có một lớp với các điểm đại diện cho các vụ tai nạn đường bộ nghiêm trọng và trường "date_14_D" chứa ngày của họ nhưng loại của nó là chuỗi. Tôi muốn chuyển đổi trường chuỗi này thành trường ngày nhưng nút OK không hoạt động. Có vấn đề gì vậy? Tôi sử dụng QGis. Nhìn vào bức tranh dưới đâynhập mô tả hình ảnh ở đây


1
Nó nói gì khi bạn nhấp vào "thông tin thêm"?
Matthias Kuhn

Tôi nghĩ rằng định dạng ngày là sai; QGIS mong đợi một cái gì đó như 'YYYY-MM-DD'.
ArMoraer

Lỗi phân tích cú pháp: Lỗi Eval: Không thể chuyển đổi "% 1".
ilias m

Tôi đã chuyển đổi định dạng như @ArMoraer cho biết tôi đã lặp lại quy trình nhưng một lần nữa nút OK không hoạt động.
ilias m

Câu trả lời:


13

Tôi ngạc nhiên tôi đã không nhìn thấy điều này trước đây. Có lẽ tôi đang nhìn một cái gì đó rõ ràng :)

Mặc dù bạn đang sử dụng một ngôn ngữ khác với tôi, nhưng bạn đang sử dụng định dạng ngày giống như tôi làm ở Anh, dd / MM / yyyy. Tôi nhận được một lỗi hơi khác (trên QGIS 2.16.1) nhưng nó không giống như định dạng ngày đó.

Bạn có thể khắc phục điều này bằng cách tạo một tập lệnh python ngắn trong tab trình soạn thảo chức năng của trình soạn thảo biểu thức.

  • Đi vào tab trình soạn thảo chức năng trong trình soạn thảo biểu thức
  • Tạo một chức năng mới (nút "Tập tin mới")
  • dán sau vào cửa sổ mã. Bạn có thể nhận được lỗi thụt lề, do đó, thụt lại bằng tay với khoảng trắng nếu cần
  • nhấp vào nút "Tải" để lưu các thay đổi
  • chuyển về tab biểu thức
  • nhìn dưới tiêu đề python, bây giờ sẽ thấy một hàm gọi là 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')

Sau đó, bạn có thể nhập một biểu thức như vậy, sử dụng tên trường của bạn: -

parse_date_dmy("mydate") 

Nếu tất cả đều ổn, bạn sẽ thấy một cái gì đó như thế này ...

nhập mô tả hình ảnh ở đây


Cảm ơn rất nhiều cho câu trả lời chi tiết của bạn. Nó đã làm việc. Nhưng, đối với một số ngày, kết quả là null. Có lời giải thích nào không?
ilias m

1
hãy thử d / M / yyyy làm chuỗi định dạng của bạn (xem thông số chuỗi định dạng ngày Qt , mặc dù lưu ý rằng đây là trang Qt5). Tôi đã thử nghiệm nó trong nhiều ngày và tháng với các số liệu đơn và đôi và nó có vẻ hoạt động tốt. Nếu nó hoạt động tôi sẽ cập nhật câu trả lời của tôi.
Steven Kay

Lần đầu tiên tôi chạy thủ tục này, định dạng của ngày là d / M / yyyy. Tôi đã cố gắng chạy nó với định dạng d / M / yyyy một lần nữa và kết quả của một số hồ sơ là không như đã đề cập ở trên. Ngoài ra, tôi chạy nó với định dạng dd / MM / yyyy và kết quả là tất cả các hồ sơ đều không có giá trị. Tôi đã làm sai sth?
ilias m

1

Hoặc đơn giản là sử dụng:

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

Với MAJ là trường ngày của bạn (dd / MM / YYYY).


1

Một bản cập nhật cho QGIS 3 của câu trả lời rõ ràng của @Steven Kay

Bạn có thể khắc phục điều này bằng cách tạo một tập lệnh python ngắn trong tab trình soạn thảo chức năng của trình soạn thảo biểu thức.

  • Đi vào tab trình soạn thảo chức năng trong trình soạn thảo biểu thức
  • Tạo một chức năng mới (nút "Tập tin mới")
  • dán sau vào cửa sổ mã. Bạn có thể nhận được lỗi thụt lề, do đó, thụt lại bằng tay với khoảng trắng nếu cần
  • nhấp vào nút "Tải" để lưu các thay đổi
  • chuyển về tab biểu thức
  • nhìn dưới tiêu đề python, bây giờ sẽ thấy một hàm gọi là 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')

Sau đó, bạn có thể nhập một biểu thức như vậy, sử dụng tên trường của bạn: -

parse_date_dmy("mydate") 

Nếu tất cả đều ổn, bạn sẽ thấy một cái gì đó như thế này ...

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.