在时间戳表上旋转的Pandas会返回意外结果

时间:2016-10-04 12:00:23

标签: python datetime pandas time-series pivot-table

我有一个包含两列的DataFrame:ts(时间戳)和n(数字)

时间戳从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 个答案:

答案 0 :(得分: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),因为dtype的{​​{1}}为ts之前。

我认为然后需要将datetime投射到datetime,但首先要values转换为int

numpy array