Я пытаюсь преобразовать столбец DataFrame String в формат Date в Julia, но если столбец содержит отсутствующие значения, возникает ошибка:
ERROR: MethodError: no method matching Int64(::Missing)
Код, который я пытался запустить (который работает для столбцов без отсутствующих данных):
df_pp[:tod] = Date.(df_pp[:tod], DateFormat("d/m/y"));
Другие строки кода, которые я пробовал:
df_pp[:tod] = Date.(passmissing(df_pp[:tod]), DateFormat("d/m/y"));
df_pp[.!ismissing.(df_pp[:tod]), :tod] = Date.(df_pp[:tod], DateFormat("d/m/y"));
Код относится к столбцу с именем tod
во фрейме данных с именем df_pp
. Оба пакета DataFrames
и Dates
были загружены перед попыткой этого.
passmissing
способ
df_pp.tod = passmissing(x->Date(x, DateFormat("d/m/y"))).(df_pp.tod)
Здесь происходит следующее: passmissing
принимает функцию и возвращает новую функцию, которая обрабатывает missing
s (возвращая missing
). Внутри скобок в x->Date(x, DateFormat("d/m/y"))
я определяю новую анонимную функцию, которая вызывает функцию Date
с соответствующим DateFormat
.
Наконец, я использую функцию, возвращаемую passmissing
, сразу на df_pp.tod
, используя .
для трансляции по столбцу.
Синтаксис будет легче увидеть, если я разделю его:
myDate(x) = Date(x, DateFormat("d/m/y"))
Date_accepting_missing = passmissing(myDate)
df_pp[:tod] = Date_accepting_missing.(df_pp[:tod])
Я добавил некоторые пояснения - стало ли это яснее?
Большое спасибо. переписал это как:
df_pp[:tod] = passmissing(x->Date(x, DateFormat("d/m/y"))).(df_pp[:tod]);
для согласованности, но это работает! Надеюсь, скоро я буду понимать синтаксис немного лучше.