Как преобразовать строковое поле в поле даты


9

У меня есть слой с точками, которые представляют дорожно-транспортные происшествия со смертельным исходом, а поле «date_14_D» содержит их дату, но его тип - строка. Я хотел бы преобразовать это строковое поле в поле даты, но кнопка ОК неактивна. В чем проблема? Я использую QGis. Смотри картинку нижевведите описание изображения здесь


1
Что это говорит, когда вы нажимаете «больше информации»?
Матиас Кун

Я думаю, что формат даты неправильный; QGIS ожидает что-то вроде «ГГГГ-ММ-ДД».
ArMoraer

Ошибка анализа: ошибка оценки: преобразование "% 1" невозможно.
илиас м

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

Ответы:


13

Я удивлен, что не видел этого раньше. Возможно я пропускаю что-то очевидное :)

Хотя вы используете для меня другую локаль, вы используете тот же формат даты, что и в Великобритании, дд / мм / гггг. Я получаю немного другую ошибку (в 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')

Затем вы можете ввести такое выражение, используя имя вашего поля: -

parse_date_dmy("mydate") 

Если все хорошо, вы должны увидеть что-то вроде этого ...

введите описание изображения здесь


Большое спасибо за ваш подробный ответ. Это сработало. Но для некоторых дат результат был нулевым. Есть ли объяснение?
илиас м

1
попробуйте d / M / yyyy в качестве строки формата (смотрите спецификацию строки формата даты Qt , хотя обратите внимание, что это страница Qt5). Я проверял это дни и месяцы с одинарными и двойными числами, и это, казалось, работало хорошо. Если это сработает, я обновлю свой ответ.
Стивен Кей,

При первом запуске этой процедуры формат даты был д / м / гггг. Я попытался запустить это в формате d / M / yyyy снова, и результат некоторых записей был нулевым, как это было упомянуто выше. Кроме того, я запускаю это в формате dd / MM / yyyy, и в результате все записи были нулевыми. Я сделал что-то не так?
ilias m

1

Или просто используйте:

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

С MAJ в качестве поля даты (дд / мм / гггг).


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

Если все хорошо, вы должны увидеть что-то вроде этого ...

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.