datetime.strptime 不接受自定义函数传递的参数

datetime.strptime not taking argument passed by custom function

我正在尝试创建一个可重用的 def 函数,将 pandas 数据框列中的 Julian 日期转换为 Gregorian 样式日期。使用该函数时,出现类型错误:strptime() argument 1 must be str, not 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:


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

我可以按如下方式实现我想要的输出,但是我必须修改上面的函数并且还使用带有lambda函数的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 问题?我将 "x" 转换为字符串。

datetime 仅适用于单个字符串,而不适用于您拥有的系列。当您将 df['DATE_GL'] 发送到您的函数时,您将发送该列的三个值。 要使用数据框的完整列,您应该更改:
datetime.datetime.strptime(x,'%y%j') 到 x = pd.to_datetime(x, 格式 = '%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'])

可能值得注意的是,您可以在没有自定义函数的情况下实现相同的效果:

df['DATE_GL'] = pd.to_datetime(df['DATE_GL'].astype(str).str[1:6], format='%y%j')