2017-08-18 63 views
-1

我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赫茲)在數據幀中並不總是恆定的,並且對於某些秒我有8或9個採樣。

  1. 我想在我的DATATIME指定毫秒(6時23分08秒**。** 100,6時23分08秒**。** 200等)
  2. 我也要喜歡做缺失樣本的插值。

一些想法如何做到這一點的熊貓嗎?

+1

我只看到相同的時間戳兩行。如果我們要以'100ms'或'10 Hz'的頻率對數據幀進行重新索引,我們只需將同一秒內的所有行集中到相應的第一個十分之一秒。剩下的9分十秒將是空的。您的數據必須包含小數秒的信息,否則此練習將失敗。請提供小數秒的示例數據。 – piRSquared

回答

0

首先,讓我們創建這可能類似於您的數據的一些樣本數據。

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

更新:根據中和意見的討論:

說我們的初步數據沒有毫秒的信息。

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'), 

分配新值數據框

df_new['Date'] = updated_dates 
+0

感謝插值和加入的想法。我的DF的問題是我每秒有10個樣本,但不是時間的規格,所以以毫秒爲單位。因此,我有10個數據具有相同的時間戳,我無法加入新的df_new。我想我應該先將毫秒添加到我的原始df中,然後再將它添加到df_new中。但我不知道該怎麼做。任何想法? –

+0

您可以隨機將100 * n毫秒添加到每個數據點。但這不會給你正確的數據順序。要點是如果你的原始數據沒有毫秒,那麼通過隨機產生毫秒來產生錯誤的數據。 –

+0

@EmanuelaLiaci更新了代碼以將毫秒信息添加到數據框。 –