我正在将Pandas 0.23.4与Python 3.7.1结合使用。
我一直在收集ICMP ping答复,并希望通过熊猫对其进行分析。
输入文件包含以下数据:
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
)。我想做的是插入timestamp列的值,因为我在超时前后都有一个值。
但是,如果我尝试:
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
插值似乎什么都没做的任何原因吗?
答案 0 :(得分:1)
插值方法需要实数,而不是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