datetime.strptime не принимает аргумент, переданный пользовательской функцией - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать повторно используемую функцию 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? Я преобразовал «х» в строку.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Вероятно, стоит отметить, что вы можете достичь того же самого без пользовательской функции:

df['DATE_GL'] = pd.to_datetime(df['DATE_GL'].astype(str).str[1:6], format='%y%j')
1 голос
/ 04 мая 2019

datetime работает только с отдельными строками, а не с сериями, как у вас.Когда вы отправляете df ['DATE_GL'] в вашу функцию, вы отправляете три значения столбца.Для работы с полным столбцом кадра данных вам необходимо изменить:
datetime.datetime.strptime (x, '% y% j') на x = pd.to_datetime (x, format = '% y% j')

Ваш код должен быть таким:

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 = pd.to_datetime(x, format = '%y%j')
    return x

df['DATE_GL'] = my_func(df['DATE_GL'])
...