首页 > 解决方案 > 插值 pandas 缺少 datetime64 值

问题描述

我将 Pandas 0.23.4 与 Python 3.7.1 一起使用。

我一直在收集 ICMP ping 回复,并想用 pandas 分析它们。

输入文件包含如下数据:

13:27:19.651425 64 bytes from 1.1.1.1: icmp_seq=26 ttl=57 time=15.643 ms
13:27:20.652464 64 bytes from 1.1.1.1: icmp_seq=27 ttl=57 time=11.957 ms
13:27:21.653371 64 bytes from 1.1.1.1: icmp_seq=28 ttl=57 time=12.201 ms

提取的数据:sequencetimestamp和。ttltime elapsed

但是,有时会出现超时,如下所示:

Request timeout for icmp_seq 6478

在这种情况下,我唯一可以解析的数据是sequence.

我的数据框dtypes看起来像这样:

elapsed              object
timestamp    datetime64[ns]
ttl                  object
dtype: object

索引是一个Int64Index(序列列)。

已记录的超时将包含NA(NAT用于时间戳)。我想做的是插入时间戳列的值,因为我在超时之前和之后都有一个值。

但是,如果我尝试:

df_ping.timestamp.interpolate(method='linear')

它仍然返回

5060   2018-12-11 14:51:28.704059
5061                          NaT
5062                          NaT
5063                          NaT
5064                          NaT
5065                          NaT
5066                          NaT
5067                          NaT
5068                          NaT
5068   2018-12-11 14:51:38.255034
5069   2018-12-11 14:51:38.255073

另一个例子:

4673   2018-12-11 14:45:00.769315
4674                          NaT
4675   2018-12-11 14:45:02.449024

插值似乎没有做任何事情的任何原因?

标签: pythonpandasdataframe

解决方案


插值方法需要实数,而不是datetime对象。您需要将数字转换为浮点数。通过减去最小的时间戳来做到这一点,这样您就有足够的精度来存储您的数字。插值并添加偏移量。

import pandas as pd

t0 = df.timestamp.min()
m = df.timestamp.notnull()
df.loc[m, 't_int'] = (df.loc[m, 'timestamp'] - t0).dt.total_seconds()

df['timestamp'] = t0 + pd.to_timedelta(df.t_int.interpolate(), unit='s')

输出:

                         timestamp     t_int
5060 2018-12-11 14:51:28.704059000  0.000000
5061 2018-12-11 14:51:29.765278444       NaN
5062 2018-12-11 14:51:30.826497889       NaN
5063 2018-12-11 14:51:31.887717333       NaN
5064 2018-12-11 14:51:32.948936778       NaN
5065 2018-12-11 14:51:34.010156222       NaN
5066 2018-12-11 14:51:35.071375667       NaN
5067 2018-12-11 14:51:36.132595111       NaN
5068 2018-12-11 14:51:37.193814556       NaN
5068 2018-12-11 14:51:38.255034000  9.550975
5069 2018-12-11 14:51:38.255073000  9.551014

推荐阅读