python:为什么一个系列的dtype不能是datetime64[ns]用户apply(lambdax:x-x.max())/np,timedelta64(1,'D'),但(x-x.max)/np.timedelta65(1,‘D')

yk9xbfzb  于 2022-10-23  发布在  Python
关注(0)|答案(1)|浏览(161)

我有一个pd.Series,如下所示:


小时
我想计算aa.max之间的差值,同时将差值格式转换为float。我可以使用图片2做我想做的事情,但为什么图片3中的方法失败了?

图2(正确):

图3(错误):

错误消息:

gt0wga4j

gt0wga4j1#

a.apply(lambda x:x-x.max())/np.timedelta64(1,'D')的问题是您试图从时间戳(即x)获取max。但是,如错误消息中所述,“'Timestamp'对象不可调用”。因此,在这种情况下,它试图告诉您,可以理解,时间戳没有函数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

相关问题