【发布时间】: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