插入缺少datetime64值的大熊猫

时间:2018-12-11 15:35:20

标签: python pandas dataframe

我正在将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

提取的数据:sequencetimestampttltime 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

插值似乎什么都没做的任何原因吗?

1 个答案:

答案 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