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

标签 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]

O 在这里缺少什么?并且是否有更好的方法来实现相同的目标(尝试在表中首次出现 n 时以天为单位获取偏移量)

最佳答案

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,但是值被转换为 datetime (1970-01-01),因为 ts 的 dtype 之前是 datetime

我认为然后需要将datetime 转换为int,但首先通过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

关于python - 在时间戳表上旋转的 Pandas 返回意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39851743/

相关文章:

python - 如何在 python 中循环包含 3 层子文件夹的整个文件夹

python - 创建单个 python 可执行模块

python - 如何在 google colab 上使用 Box 2 D

api - RESTful API设计-传递日期的最佳做法

python - 所有可能的 (1,2....x) 字母组合

python - Pandas 日期时间索引的算术运算

python - 按日期分组数据并在 python 中找到平均值

python - 合并 2 个数据帧的不同值的相同输出

python - 无法将输入转换为时间戳、bday_range(...) - Pandas/Python

python - 分组后 Pandas Data Frame 的变化率