2016-04-01 38 views
2

Ben şu kod, bir veri çerçevesi içinde 'Tarihler' sütununun saat bulmaya çalışırken:Python: pandalar lambda ifadede bir işlevi kullanmak

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)) benziyor:

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

kimse Kaçırdığım biliyor mu:

0 2015-05-13 23:53:00 
1 2015-05-13 23:53:00 
2 2015-05-13 23:33:00 

Ancak, aşağıdaki hata var? Teşekkürler! Aşağıda gibi lambda hattında işlevi doğrudan koyarsanız, her şey iyi çalıştığını


Not: henüz tanımlandıktan önce find_hour kullanmaya çalışıyorsanız

df['hour'] = df.apply(lambda x: x['Dates'][11:13], axis=1).astype(float) 
+0

Ayrıca saat çıkarabilir eğer bir datetime nesnesi ise, doğrudan x'den mi ve kendisinin olması gereken şey nedir? –

cevap

5

. Sadece etrafında şeyleri değiştirmek gerekir:

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) 

Düzenleme: find_hour() iki argüman, self ve input almak şeklinde belirlenmiştir, ancak bunu yalnızca birini veriyoruz: Padraic çok önemli bir noktayı işaret etti. find_hour()'u def find_hour(input): olarak tanımlamalısınız, bağımsız değişkeni input olarak tanımlayın. Bunu biraz daha açıklayıcı bir şeye yeniden adlandırmayı düşünebilirsiniz.

+1

Kendinden –

+0

@PadraicCunningham'den dolayı hata yapmaya devam edeceğim: İyi nokta. Düzenlenen. – zondo

1

Eski iyi .dt.hour ile sorun nedir?

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 

ve Date sütun tel türünden olup olmadığını datetime ilk dönüştürmek isteyebilirsiniz:

df.Date = pd.to_datetime(df.Date) 

ya da sadece:

df['hour'] = int(df.Date.str[11:13]) 
İlgili konular