Як перетворити рядок у поле дати


10

У мене є шар з точками, які відображають смертельні дорожньо-транспортні пригоди, а поле "дати_14_D" містить їх дату, але тип її є рядковим. Я хотів би перетворити це рядкове поле в поле дати, але кнопка ОК неактивна. В чому проблема? Я використовую QGis. Подивіться малюнок нижчевведіть тут опис зображення


1
Що це говорить, коли ви натискаєте "більше інформації"?
Маттіас Кун

Я думаю, що формат дати неправильний; QGIS очікує щось на кшталт "РРРР-ММ-DD".
ArMoraer

Помилка розбору: Помилка Eval: Перетворення "% 1" не було можливим.
ilias m

Я перетворив формат, як @ArMoraer сказав, що я повторив процедуру, але знову кнопка ОК неактивна.
ilias m

Відповіді:


14

Я здивований, що раніше цього не бачив. Можливо, я не помічаю чогось очевидного :)

Хоча ви використовуєте для мене іншу локаль, ви використовуєте той самий формат дати, що і у Великобританії, дд / MM / рр. Я отримую дещо іншу помилку (на QGIS 2.16.1), але це формат дати не подобається.

Ви можете обійти це, створивши короткий скрипт python на вкладці функціонального редактора редактора виразів.

  • Перейдіть на вкладку редактора функцій у редакторі виразів
  • Створіть нову функцію (кнопка "Новий файл")
  • вставте наступне у вікно коду. Можливо, ви отримаєте помилки відступу, тому вручну повторно відступайте пробілами, якщо потрібно
  • натисніть кнопку "Завантажити", щоб зберегти зміни
  • перейти назад на вкладку виразів
  • Подивіться під заголовок python, тепер слід побачити функцію під назвою 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). Я перевіряв це днями і місяцями одинарними та подвійними цифрами, і, здавалося, він працює добре. Якщо це працює, я оновлю свою відповідь.
Стівен Кей

Перший раз, коли я запускав цю процедуру, формат дати був 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 / GYYY).


1

Оновлення для QGIS 3 кристально чистої відповіді від @Steven Kay

Ви можете обійти це, створивши короткий скрипт python на вкладці функціонального редактора редактора виразів.

  • Перейдіть на вкладку редактора функцій у редакторі виразів
  • Створіть нову функцію (кнопка "Новий файл")
  • вставте наступне у вікно коду. Можливо, ви отримаєте помилки відступу, тому вручну повторно відступайте пробілами, якщо потрібно
  • натисніть кнопку "Завантажити", щоб зберегти зміни
  • перейти назад на вкладку виразів
  • Подивіться під заголовок python, тепер слід побачити функцію під назвою 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

Я не знаю, як це було ще в 2016 році, але, як для QGIS 3.10, це реалізується в доступних функціях QGIS в редакторі виразів або польовому калькуляторі. Документація праворуч (у діалоговому вікні calc поля) дає вам рішення:

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

(пробіли необов’язкові) та натисніть "ОК". Пристосуйте "формат" до того, який присутній у вашій таблиці атрибутів. Наприклад, якщо ваші дати виглядають приблизно так 07.3.03, правильним форматом для цього буде dd.M.yy*. Зверніть увагу на використання великих літер, оскільки символ mозначає «хвилини» і Mозначає «місяці».

  • Це не формат, який ніхто не повинен використовувати. Якщо ви отримаєте файл у такому форматі, будь ласка, поговоріть з начальником відправника. Це не витримає!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.