我有一个pd.Series,如下所示:
pd.Series
小时我想计算a和a.max之间的差值,同时将差值格式转换为float。我可以使用图片2做我想做的事情,但为什么图片3中的方法失败了?
a
a.max
float
图2(正确):
图3(错误):
错误消息:
gt0wga4j1#
a.apply(lambda x:x-x.max())/np.timedelta64(1,'D')的问题是您试图从时间戳(即x)获取max。但是,如错误消息中所述,“'Timestamp'对象不可调用”。因此,在这种情况下,它试图告诉您,可以理解,时间戳没有函数max。您正在寻找a.max(),而不是x.max()。
a.apply(lambda x:x-x.max())/np.timedelta64(1,'D')
x
max
a.max()
x.max()
数据
import pandas as pd from datetime import datetime data = [datetime(1997,1,1),datetime(1997,1,12),datetime(1998,5,28), datetime(1997,12,12),datetime(1998,1,3)] a = pd.Series(data, index=range(1,6), name='user_id') print(a) 1 1997-01-01 2 1997-01-12 3 1998-05-28 4 1997-12-12 5 1998-01-03 Name: user_id, dtype: datetime64[ns]
代码
# using `pd.Timedelta` avoids having to import `np` b = (a-a.max())/pd.Timedelta(days=1) print(b) 1 -512.0 2 -501.0 3 0.0 4 -167.0 5 -145.0 Name: user_id, dtype: float64 # use `a.max()` instead of `x.max()`: c = a.apply(lambda x:x-a.max())/pd.Timedelta(days=1) print(b.equals(c)) # True # refactored solution: d = a.sub(a.max()).dt.days print(d) 1 -512 2 -501 3 0 4 -167 5 -145 Name: user_id, dtype: int64 # chain `.astype(float)`, if you specifically want `floats`: print(a.sub(a.max()).dt.days.astype(float).equals(b)) # True
1条答案
按热度按时间gt0wga4j1#
a.apply(lambda x:x-x.max())/np.timedelta64(1,'D')
的问题是您试图从时间戳(即x
)获取max
。但是,如错误消息中所述,“'Timestamp'对象不可调用”。因此,在这种情况下,它试图告诉您,可以理解,时间戳没有函数max
。您正在寻找a.max()
,而不是x.max()
。数据
代码