我有以下代码,试图在数据框中找到“日期”列的小时:
print(df['Dates'].head(3))
df['hour'] = df.apply(lambda x: find_hour(x['Dates']), axis=1)
def find_hour(self, input):
return input[11:13].astype(float)
print(df['Dates'].head(3))
的样子:
0 2015-05-13 23:53:00
1 2015-05-13 23:53:00
2 2015-05-13 23:33:00
但是,我收到以下错误:
df['hour'] = df.apply(lambda x: find_hour(x['Dates']), axis=1)
NameError: ("global name 'find_hour' is not defined", u'occurred at index 0')
有谁知道我错过了什么?谢谢!
请注意,如果我将函数直接放在lambda行中,如下所示,一切正常:
df['hour'] = df.apply(lambda x: x['Dates'][11:13], axis=1).astype(float)
答案 0 :(得分:8)
您之前尝试使用find_hour
。你只需要改变一下:
def find_hour(self, input):
return input[11:13].astype(float)
print(df['Dates'].head(3))
df['hour'] = df.apply(lambda x: find_hour(x['Dates']), axis=1)
修改:Padraic指出了一个非常重要的观点:find_hour()
被定义为接受两个参数,self
和input
,但是你给它了只有一个。您应该将find_hour()
定义为def find_hour(input):
,但定义参数为input
会影响内置函数。您可以考虑将其重命名为更具描述性的内容。
答案 1 :(得分:4)
老牌.dt.hour
出了什么问题?
In [202]: df
Out[202]:
Date
0 2015-05-13 23:53:00
1 2015-05-13 23:53:00
2 2015-05-13 23:33:00
In [217]: df['hour'] = df.Date.dt.hour
In [218]: df
Out[218]:
Date hour
0 2015-05-13 23:53:00 23
1 2015-05-13 23:53:00 23
2 2015-05-13 23:33:00 23
如果您的Date
列属于字符串类型,则可能需要将其转换为日期时间第一个:
df.Date = pd.to_datetime(df.Date)
或只是:
df['hour'] = int(df.Date.str[11:13])