Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python datetime.strTime不接受自定义函数传递的参数_Python_Pandas_Datetime_Strptime - Fatal编程技术网

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

Python datetime.strTime不接受自定义函数传递的参数,python,pandas,datetime,strptime,Python,Pandas,Datetime,Strptime,我正在尝试创建一个可重用的def函数,将pandas数据框列中的儒略日期转换为格里高利日期。使用该函数时,我得到一个TypeError:strTime()参数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 0

我正在尝试创建一个可重用的def函数,将pandas数据框列中的儒略日期转换为格里高利日期。使用该函数时,我得到一个TypeError:strTime()参数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代码行,它们帮助我实现上面想要的结果

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”转换为字符串。

日期时间只适用于单个字符串,而不适用于您已有的系列。当您向函数发送df['DATE\u GL']时,您正在发送该列的三个值。 要使用数据帧的完整列,您应该更改:
datetime.datetime.StrTime(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'])

datetime只适用于单个字符串,而不适用于现有的系列。当您向函数发送df['DATE\u GL']时,您正在发送该列的三个值。 要使用数据帧的完整列,您应该更改:
datetime.datetime.StrTime(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')

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

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

这是有效的,正是我所需要的!感谢您解释datetime.datetime如何在一个系列上不起作用,并建议使用pd.to_datetime。我以前从来没有用过它。它很有效,正是我所需要的!感谢您解释datetime.datetime如何在一个系列上不起作用,并建议使用pd.to_datetime。我以前从未使用过。这也很好用,我可能会在做日期转换时亲自使用它,但我选择Pablo的答案作为最佳答案,因为我需要将它构建到一个函数中,所以当我将它推广到我公司的其他用户时,他们将更容易基本上应用该函数。尽量简单地使用尽可能少的代码。谢谢你的建议。这也很有效,我可能会在做日期转换时亲自使用它,但我选择Pablo的答案作为最佳答案,因为我需要将它构建到一个函数中,所以当我将它推广到我公司的其他用户时,他们将更容易基本上应用该函数。尽量简单地使用尽可能少的代码。谢谢你的建议。