【问题标题】:Missing samples of a dataframe in pandas熊猫中缺少数据框的样本
【发布时间】:2017-08-18 14:49:57
【问题描述】:

我的 df:

In [163]: df.head()
Out[163]: 
                       x-axis    y-axis    z-axis
time   
2017-07-27 06:23:08 -0.107666 -0.068848  0.963623
2017-07-27 06:23:08 -0.105225 -0.070068  0.963867
.....

我将索引设置为日期时间。由于数据帧中的采样率 (10 Hz) 并不总是恒定的,因此我有 8 或 9 个样本。

  1. 我想指定数据时间的毫秒数(06:23:08**.100**、06:23:08**.200** 等)
  2. 我还想对缺失的样本进行插值。

一些想法如何在熊猫中做到这一点?

【问题讨论】:

  • 我只看到两行具有相同的时间戳。如果我们以100ms10 Hz 的频率重新索引数据帧,我们只需将具有相同秒数的所有行集中到相应的第一个十进制秒中。剩下的 9 分秒将是空的。您的数据必须包含小数秒的信息,否则此练习将失败。请提供带小数秒的示例数据。

标签: python pandas datetime sampling


【解决方案1】:

首先让我们创建一些可能类似于您的数据的示例数据。

import pandas as pd
from datetime import timedelta
from datetime import datetime

base = datetime.now()
date_list = [base - timedelta(days=x) for x in range(0, 2)]
values = [v for v in range(2)]
df = pd.DataFrame.from_dict({'Date': date_list, 'values': values})

df = df.set_index('Date')
df

                           values
Date    
2017-08-18 20:42:08.563878  0
2017-08-17 20:42:08.563878  1

现在我们将使用每 100 毫秒的数据点创建另一个数据帧。

min_val = df.index.min()
max_val = df.index.max()

all_val = []
while min_val <= max_val:
    all_val.append(min_val)
    min_val += timedelta(milliseconds=100)
# len(all_val) 864001 
df_new = pd.DataFrame.from_dict({'Date': all_val})
df_new = df_new.set_index('Date')

让我们加入两个数据框,这样所有缺失的行都会有索引但没有值。

final_df = df_new.join(df)
final_df

                            values
Date    
2017-08-17 20:42:08.563878  1.0
2017-08-17 20:42:08.663878  NaN
2017-08-17 20:42:08.763878  NaN
2017-08-17 20:42:08.863878  NaN
2017-08-17 20:42:08.963878  NaN
2017-08-17 20:42:09.063878  NaN
2017-08-17 20:42:09.163878  NaN

现在插入数据:

df_final.interpolate()

                            values
Date    
2017-08-17 20:42:08.563878  1.000000
2017-08-17 20:42:08.663878  0.999999
2017-08-17 20:42:08.763878  0.999998
2017-08-17 20:42:08.863878  0.999997
2017-08-17 20:42:08.963878  0.999995
2017-08-17 20:42:09.063878  0.999994
2017-08-17 20:42:09.163878  0.999993
2017-08-17 20:42:09.263878  0.999992

一些插值策略:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.interpolate.html

更新:根据 cmets 中的讨论:

假设我们的初始数据没有毫秒信息。

df_new_date_without_miliseconds = df_new['Date']
df_new_date_without_miliseconds[0] # Timestamp('2017-08-17 21:45:49')

max_value_date = df_new_date_without_miliseconds[0]
max_value_miliseconds = df_new_date_without_miliseconds[0]

updated_dates = []
for val in df_new_date_without_miliseconds:
    if val == max_value_date:
        val = max_value_miliseconds + timedelta(milliseconds=100)
        max_value_miliseconds = val
    elif val > max_value_date:
        max_value_date = val + timedelta(milliseconds=0)
        max_value_miliseconds = val
    updated_dates.append(val)

output:

[Timestamp('2017-08-17 21:45:49.100000'),
 Timestamp('2017-08-17 21:45:49.200000'),
 Timestamp('2017-08-17 21:45:49.300000'),
 Timestamp('2017-08-17 21:45:50'),
 Timestamp('2017-08-17 21:45:50.100000'),

将新值分配给 DataFrame

df_new['Date'] = updated_dates

【讨论】:

  • 感谢插值和加入的想法。我的 df 的问题是我每秒有 10 个样本,但不是时间规范,所以以毫秒为单位。因此,我有 10 个具有相同时间戳的数据,无法加入新的 df_new。我想我应该先在原始 df 中添加毫秒,然后再将其添加到 df_new。但我不知道该怎么做。有什么想法吗?
  • 您可以为每个数据点随机添加 100 *n 毫秒。但这不会给你正确的数据顺序。关键是如果您的原始数据没有毫秒,那么通过生成随机毫秒,您将创建错误的数据。
  • @EmanuelaLiaci 更新代码以向数据帧添加毫秒信息。
猜你喜欢
  • 2017-06-22
  • 1970-01-01
  • 2021-12-18
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多