【问题标题】:datetime.strptime not taking argument passed by custom functiondatetime.strptime 不接受自定义函数传递的参数
【发布时间】:2019-05-03 21:52:46
【问题描述】:

我正在尝试创建一个可重用的 def 函数,将 pandas 数据框列中的儒略日期转换为公历样式日期。使用该函数时,我得到一个 TypeError: 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                                 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”转换为字符串。

【问题讨论】:

    标签: python pandas datetime strptime


    【解决方案1】:

    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'])
    

    【讨论】:

    • 这行得通,正是我所需要的!感谢您解释 datetime.datetime 如何在系列中不起作用并建议使用 pd.to_datetime。我以前从未使用过。
    【解决方案2】:

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

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

    【讨论】:

    • 这也很有效,我可以在进行日期转换时将其用于我自己的用途,但我选择 Pablo 的答案作为最佳答案,因为我需要将它构建到一个函数中,所以当我将其推广给我公司的其他用户,他们将更容易从本质上应用该功能。尝试简单地为他们使用尽可能少的代码。感谢您的建议。
    猜你喜欢
    • 2015-04-15
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多