2017-03-08 99 views
1

我在列中有一個帶有時間戳的pandas.DataFrame。這些值在時間上相隔0.1秒。值如1488771900.100000, 1488771900.200000等。但是,缺少值。所以我有1488794389.500000,然後1488794389.900000與3之間的缺失值。我想插入數據框中的行,並在此列中的最大值和最小值之間缺少值。所以,如果最小值爲1488771900.000000,最大值爲1488794660.000000,我想插入所有其他列中所有值相隔0.1秒的NA和NA。在熊貓數據框中添加缺失時間

我在link看到了一個答案,但無法複製相同的結果。

如何執行此操作?

+0

該鏈接後應該已經工作,請發表原料數據,創建df的代碼,您的嘗試和任何錯誤 – EdChum

回答

2

您可以使用pandas.DataFrame.resample填寫缺失的時間。需要注意的是數據幀需要有一個pandas.DateTimeIndex。在你的情況下,這個時間很可能在時間以秒爲單位被存儲爲一個浮點數,這需要在重新採樣之前進行轉換。這是一個將執行該操作的函數。

代碼:

import datetime as dt 
import pandas as pd 

def resample(dataframe, time_column, sample_period): 
    # make a copy of the dataframe 
    dataframe = dataframe.copy() 

    # convert epoch times to datetime 
    dataframe.time = dataframe.time.apply(
     lambda ts: dt.datetime.fromtimestamp(ts)) 

    # make the datetimes into an index 
    dataframe.set_index(time_column, inplace=True) 

    # resample to desired period 
    dataframe = dataframe.resample(sample_period).asfreq().reset_index() 

    # convert datetimes back to epoch 
    epoch = dt.datetime.fromtimestamp(0) 
    dataframe.time = dataframe.time.apply(
     lambda ts: (ts - epoch).total_seconds()) 
    return dataframe 

測試代碼:

values = [ 
    (1488771900.10, 'a'), 
    (1488771900.20, 'b'), 
    (1488771900.30, 'c'), 
    (1488771900.60, 'f'), 
] 
columns = ['time', 'value'] 
df = pd.DataFrame(values, columns=columns) 
print(df) 

new_df = resample(df, 'time', '100ms') 
print(new_df) 

結果:

  time value 
0 1.488772e+09  a 
1 1.488772e+09  b 
2 1.488772e+09  c 
3 1.488772e+09  f 

      time value 
0 1.488772e+09  a 
1 1.488772e+09  b 
2 1.488772e+09  c 
3 1.488772e+09 NaN 
4 1.488772e+09 NaN 
5 1.488772e+09  f 
+0

這是一個很好的答案,但'.apply()'在較大的數據幀上可能會很慢。相反,也許可以查看'df ['time'] = pd.to_datetime(df ['time'],unit ='s')'(more [here](https://stackoverflow.com/a/19231939/2327328 )) – philshem