Я пытаюсь создать повторно используемую функцию def, которая преобразует юлианскую дату в столбце данных панд в григорианский стиль. При использовании функции я получаю TypeError: аргумент strptime () 1 должен быть str, а не Series.
import pandas as pd
import datetime
df.head()
SDKCOO SDDOCO DATE_GL
0 00308 6118002.0 118337.0
1 00308 6118002.0 118337.0
2 00308 6118002.0 118337.0
in: df['DATE_GL'].dtype
out: dtype('float64')
def my_func(x):
x = x.astype(str)
year = x.str[1:3]
jday = x.str[3:6]
x = year + jday
x = x.astype(str)
x = datetime.datetime.strptime(x,'%y%j') #this line gives me the issue
return x
df['DATE_GL'] = my_func(df['DATE_GL'])
Тогда я получаю эту ошибку типа:
TypeError Traceback (most recent call last)
<ipython-input-4-bc5147e6c807> in <module>
----> 1 df['DATE_GL'] = my_func(df['DATE_GL'])
<ipython-input-3-c25482ba9377> in my_func(x)
5 x = year + jday
6 x = x.astype(str)
----> 7 x = datetime.datetime.strptime(x,'%y%j')
8 return x
TypeError: strptime() argument 1 must be str, not Series
Я могу добиться желаемого результата следующим образом, но мне нужно изменить вышеуказанную функцию, а также использовать метод apply с лямбда-функцией для достижения этого, чего я не хочу. Я хочу, чтобы все проходило через функцию, чтобы я мог легко вызывать ее и применять к другим фреймам данных, имеющим ту же проблему форматирования даты.
Желаемый вывод:
SDKCOO SDDOCO DATE_GL
0 00308 6118002.0 2018-12-03
1 00308 6118002.0 2018-12-03
2 00308 6118002.0 2018-12-03
Вот модифицированная функция и дополнительная строка кода приложения, которая помогает мне достичь желаемых результатов.
def my_func(x):
x = x.astype(str)
year = x.str[1:3]
jday = x.str[3:6]
x = year + jday
x = x.astype(str)
return x
df['DATE_GL'] = df['DATE_GL'].apply(lambda x: datetime.datetime.strptime(x,'%y%j'))
Почему я не могу получить желаемый результат, когда все проходит через мою функцию def? Что вызывает проблему TypeError? Я преобразовал «х» в строку.