python - 插值 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
提取的数据:sequence
、timestamp
和。ttl
time 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
插值似乎没有做任何事情的任何原因?
解决方案
插值方法需要实数,而不是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