【问题标题】:Fill in timestamp gaps every 11th of a second每 11 秒填充一次时间戳间隔
【发布时间】:2020-10-20 12:50:01
【问题描述】:

我有一个文本文件“example.txt”,其中包含以 11 Hz 采样的数据(因此每 11 秒一次)。

在这里您可以找到我的代码来加载文本文件并将“日期”和“时间”转换为日期时间格式。最后数据框的大小为(34,6):

import glob
import os
import datetime

#Specify file path
file = 'C:\Users\...\example.txt'

#Load file
df = pd.read_csv(file, sep=";", header=None, names=["Date", "Time", "ID1","ID2","ID3","MP","ET"],float_precision='round_trip')

#In my specific case, the txt.file has headers, which I want to remove
date = df['Date']
if date[0] == 'Date':
    df = df.iloc[1:]
    df = df.reset_index(drop=True)
    
# I erase the letters 'ms' so I only get numbers
df['Time'] = df['Time'].str[:-2]

# Put in datetime format
date = df['Date']
time = df['Time']
date_and_time = date + time
date_time_format = '%Y/%m/%d %H:%M:%S %f'
df['Time'] = pd.to_datetime(date_and_time,format=date_time_format)

# Drop Date column
df = df.drop(['Date'],axis=1)

在第 22 行和第 23 行(见下面的输出),有 35 秒的间隔。由于我想绘制这些数据,我想通过使用相同的 11 Hz 采样频率来填补这个空白。所以我想在第 22 行和第 23 行之间填充 35*11 个数据点。对于这个“填充数据”,我想将正确的时间戳和属性零归因于所有其他变量(ID1、ID2、ID3、MP 和 ET)。我已阅读有关重采样(pandas 模块)的文档,但没有在第 10 秒或第 11 秒重采样的选项。还有另一种方法可以做到这一点吗?也许有一个选项可以绘制时间戳数据中的间隙?

谢谢


df
Out[25]: 
                         Time ID1  ID2  ID3       MP               ET
0  2020-08-06 18:00:38.000000   0    0    0   230400   0.229000091553
1  2020-08-06 18:00:38.999160   0    1    1      529   0.254999876022
2  2020-08-06 18:00:38.199833   0    2    2      619   0.270999908447
3  2020-08-06 18:00:38.299750   0    3    3       84   0.292000055313
4  2020-08-06 18:00:38.399666   0    4    4      629    0.31500005722
5  2020-08-06 18:00:38.499583   0    5    5      376   0.331000089645
6  2020-08-06 18:00:38.599500   0    6    6      660    0.34299993515
7  2020-08-06 18:00:38.699417   0    7    7      160   0.354000091553
8  2020-08-06 18:00:38.799333   0    8    8      246   0.361999988556
9  2020-08-06 18:00:38.899250   0    9    9       69   0.371000051498
10 2020-08-06 18:00:38.999167   0   10   10      462   0.382999897003
11 2020-08-06 18:00:39.000000   0    0    0        3   0.229000091553
12 2020-08-06 18:00:39.999160   0    1    1       59   0.254999876022
13 2020-08-06 18:00:39.199833   0    2    2       19   0.270999908447
14 2020-08-06 18:00:39.299750   0    3    3        8   0.292000055313
15 2020-08-06 18:00:39.399666   0    4    4        9    0.31500005722
16 2020-08-06 18:00:39.499583   0    5    5       36   0.331000089645
17 2020-08-06 18:00:39.599500   0    6    6        6    0.34299993515
18 2020-08-06 18:00:39.699417   0    7    7       10   0.354000091553
19 2020-08-06 18:00:39.799333   0    8    8       46   0.361999988556
20 2020-08-06 18:00:39.899250   0    9    9        9   0.371000051498
21 2020-08-06 18:00:39.999167   0   10   10        2   0.382999897003
22 2020-08-06 18:01:14.000000   0   11   11      704   0.395999908447
23 2020-08-06 18:01:14.999160   0   12   12      795   0.410000085831
24 2020-08-06 18:01:14.199833   0   13   13      532   0.421000003815
25 2020-08-06 18:01:14.299750   0   14   14      363   0.430000066757
26 2020-08-06 18:01:14.399666   0    4    4      629    0.31500005722
27 2020-08-06 18:01:14.499583   0    5    5      376   0.331000089645
28 2020-08-06 18:01:14.599500   0    6    6      660    0.34299993515
29 2020-08-06 18:01:14.699417   0    7    7      160   0.354000091553
30 2020-08-06 18:01:14.799333   0    8    8      246   0.361999988556
31 2020-08-06 18:01:14.899250   0    9    9       69   0.371000051498
32 2020-08-06 18:01:14.999167   0   10   10      462   0.382999897003
33 2020-08-06 18:01:15.000000   0   11   11        4   0.395999908447

【问题讨论】:

  • 您究竟想在这些新时间戳的值中添加什么?在我看来,用任何好的表示来填充这些数据是很困难的。

标签: python pandas dataframe timestamp


【解决方案1】:

如果您将时间戳作为时间戳,则缺失的时间间隔将由连接两侧两个数据点的线填充。我们可以通过在折线图上方使用散点图来调出合法值。

import seaborn as sns
import matplotlib.pyplot as plt
df['Time'] = pd.to_datetime(df['Time'])
plt.figure(figsize=(10, 10))
sns.lineplot(data=df, x='Time',y='ET')
sns.scatterplot(data=df,x='Time',y='ET', s=50,color='r');

【讨论】:

  • 是的,谢谢你的克里斯。那已经很有帮助了。无论如何要在图中突出显示这个缺失的数据?
  • @Geox 更新答案,这是我能想到的解决您问题的最简单方法。
【解决方案2】:

很难创建一个新的时间序列来根据您的时间序列填充缺失的值,因为时间增量不完全是 1/11 秒(大约是 090909090 微秒。)

但幸运的是,您的 df 中没有丢失样本,它们只是乱序。

如果您按时间序列数据排序,您会看到在提供的数据框中每秒有全部 11 个样本。

df = df.sort_values(by=['Time'])
df

给予:

        Time    ID1 ID2 ID3 MP  ET  Time Offset
0   2020-08-06  2020-10-20 18:00:38.000000  0   0   0   230400  0.229000091553  
2   2020-08-06  2020-10-20 18:00:38.199833  0   2   2   619 0.270999908447  0 days 00:00:00.199833000
3   2020-08-06  2020-10-20 18:00:38.299750  0   3   3   84  0.292000055313  0 days 00:00:00.099917000
4   2020-08-06  2020-10-20 18:00:38.399666  0   4   4   629 0.31500005722   0 days 00:00:00.099916000
5   2020-08-06  2020-10-20 18:00:38.499583  0   5   5   376 0.331000089645  0 days 00:00:00.099917000
6   2020-08-06  2020-10-20 18:00:38.599500  0   6   6   660 0.34299993515   0 days 00:00:00.099917000
7   2020-08-06  2020-10-20 18:00:38.699417  0   7   7   160 0.354000091553  0 days 00:00:00.099917000
8   2020-08-06  2020-10-20 18:00:38.799333  0   8   8   246 0.361999988556  0 days 00:00:00.099916000
9   2020-08-06  2020-10-20 18:00:38.899250  0   9   9   69  0.371000051498  0 days 00:00:00.099917000
1   2020-08-06  2020-10-20 18:00:38.999160  0   1   1   529 0.254999876022  0 days 00:00:00.099910000
10  2020-08-06  2020-10-20 18:00:38.999167  0   10  10  462 0.382999897003  0 days 00:00:00.000007000
11  2020-08-06  2020-10-20 18:00:39.000000  0   0   0   3   0.229000091553  0 days 00:00:00.000833000
13  2020-08-06  2020-10-20 18:00:39.199833  0   2   2   19  0.270999908447  0 days 00:00:00.199833000
14  2020-08-06  2020-10-20 18:00:39.299750  0   3   3   8   0.292000055313  0 days 00:00:00.099917000
15  2020-08-06  2020-10-20 18:00:39.399666  0   4   4   9   0.31500005722   0 days 00:00:00.099916000
16  2020-08-06  2020-10-20 18:00:39.499583  0   5   5   36  0.331000089645  0 days 00:00:00.099917000
17  2020-08-06  2020-10-20 18:00:39.599500  0   6   6   6   0.34299993515   0 days 00:00:00.099917000
18  2020-08-06  2020-10-20 18:00:39.699417  0   7   7   10  0.354000091553  0 days 00:00:00.099917000
19  2020-08-06  2020-10-20 18:00:39.799333  0   8   8   46  0.361999988556  0 days 00:00:00.099916000
20  2020-08-06  2020-10-20 18:00:39.899250  0   9   9   9   0.371000051498  0 days 00:00:00.099917000
12  2020-08-06  2020-10-20 18:00:39.999160  0   1   1   59  0.254999876022  0 days 00:00:00.099910000
21  2020-08-06  2020-10-20 18:00:39.999167  0   10  10  2   0.382999897003  0 days 00:00:00.000007000
22  2020-08-06  2020-10-20 18:01:14.000000  0   11  11  704 0.395999908447  0 days 00:00:34.000833000
24  2020-08-06  2020-10-20 18:01:14.199833  0   13  13  532 0.42100000381499997 0 days 00:00:00.199833000
25  2020-08-06  2020-10-20 18:01:14.299750  0   14  14  363 0.43000006675700003 0 days 00:00:00.099917000
26  2020-08-06  2020-10-20 18:01:14.399666  0   4   4   629 0.31500005722   0 days 00:00:00.099916000
27  2020-08-06  2020-10-20 18:01:14.499583  0   5   5   376 0.331000089645  0 days 00:00:00.099917000
28  2020-08-06  2020-10-20 18:01:14.599500  0   6   6   660 0.34299993515   0 days 00:00:00.099917000
29  2020-08-06  2020-10-20 18:01:14.699417  0   7   7   160 0.354000091553  0 days 00:00:00.099917000
30  2020-08-06  2020-10-20 18:01:14.799333  0   8   8   246 0.361999988556  0 days 00:00:00.099916000
31  2020-08-06  2020-10-20 18:01:14.899250  0   9   9   69  0.371000051498  0 days 00:00:00.099917000
23  2020-08-06  2020-10-20 18:01:14.999160  0   12  12  795 0.410000085831  0 days 00:00:00.099910000
32  2020-08-06  2020-10-20 18:01:14.999167  0   10  10  462 0.382999897003  0 days 00:00:00.000007000
33  2020-08-06  2020-10-20 18:01:15.000000  0   11  11  4   0.395999908447  0 days 00:00:00.000833000

【讨论】:

  • 你没抓住重点,时间差距很大。
  • 索引为 22 和 23 的行之间的巨大差距具有巨大的偏移量,因为数据框未按日期时间排序。索引 24 跟在 22 之后。原始 df 的排序方式在 22 和 23 之间有 9 个样本。而且你是正确的,时间增量是不均匀的。按时间排序的第二个样本是第一个样本之后的 0.199833 秒,但第 12 个样本是第 11 个之后的 0.000007 秒。但是,如果目标是每秒采集 11 个样本,它们都在 df 中,不需要填写任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多