2016-10-04 84 views
2

我有两列的数据帧:ts(时间戳)和n(号码)熊猫上timestap表枢转返回意想不到的结果

时间戳开始在2016-07-15

In [1]: d.head() 
Out[1]: 
         ts n 
0 2016-07-15 00:04:09.444 12 
1 2016-07-15 00:05:01.633 12 
2 2016-07-15 00:05:03.173 31 
3 2016-07-15 00:05:03.970 12 
4 2016-07-15 00:05:04.258 23 
现在

,我枢转:

pd.pivot_table(d, columns='n', values='ts', aggfunc=lambda x: (np.min(x) - pd.Timestamp('2016-07-15')).days) 

我期望看到用整数表示的列代表天,但是我看到:

n 
12 1970-01-01 
23 1970-01-01 
31 1970-01-01 
Name: ts, dtype: datetime64[ns] 

我在这里错过了什么?并有更好的方法来达到同样的(试图让抵消天的n表中的第一次亮相)

回答

1

IIUC你需要groupby并添加自定义函数apply

print (d.groupby('n')['ts'].apply(lambda x: (x.min() - pd.Timestamp('2016-07-15')).days)) 
n 
12 0 
23 0 
31 0 
Name: ts, dtype: int64 

在您的代码中,您也可以获得0,但值会转换为datetime1970-01-01),因为tsdtype之前为datetime

我觉得那么就需要投datetimeint,但首先由values转换为numpy array

s = pd.pivot_table(d, columns='n', 
         values='ts', 
         aggfunc=lambda x: (np.min(x) - pd.Timestamp('2016-07-15')).days) 
s = s.values.astype(int) 
print (s) 
n 
12 0 
23 0 
31 0 
Name: ts, dtype: int64 
+0

谢谢! groupby似乎是一个更好的替代枢纽! – bluephoton