首先,讓我們創建這可能類似於您的數據的一些樣本數據。
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
我只看到相同的時間戳兩行。如果我們要以'100ms'或'10 Hz'的頻率對數據幀進行重新索引,我們只需將同一秒內的所有行集中到相應的第一個十分之一秒。剩下的9分十秒將是空的。您的數據必須包含小數秒的信息,否則此練習將失敗。請提供小數秒的示例數據。 – piRSquared