2017-05-31 114 views
0

我有一個包含2列['startdt']和['enddt']的數據框。它們是PANDA數據框中的日期時間對象。我想創建一個新的列,它根據'startdt'和'enddt'的每個組合進行分組,並填充列的下行值,從'startdt'到10個分鐘的增量值'enddt'列。PANDA:使用增量日期時間值在2個日期時間(範圍)列之間創建'填充'列

這裏是'startdt'和'enddt'兩個GROUPINGS的例子;請注意,分組中的最後一行幾乎總是少於10分鐘,因爲它必須包含「enddt」的值並受其限制,才能捕獲「startdt」和「enddt」之間的整個範圍。

startdt    endt    newcol 
2017-05-27 11:30:00 2017-05-27 11:55:00 2017-05-27 11:40:00 
2017-05-27 11:30:00 2017-05-27 11:55:00 2017-05-27 11:50:00 
2017-05-27 11:30:00 2017-05-27 11:55:00 2017-05-27 11:55:00 
2017-05-27 14:54:00 2017-05-27 15:33:00 2017-05-27 15:04:00 
2017-05-27 14:54:00 2017-05-27 15:33:00 2017-05-27 15:14:00 
2017-05-27 14:54:00 2017-05-27 15:33:00 2017-05-27 15:24:00 
2017-05-27 14:54:00 2017-05-27 15:33:00 2017-05-27 15:33:00 

「NEWCOL」將在DF那些「startdt」和'之間創建其他2列的重複行,很明顯,但將(組的最後一行或更小)是具有10個唯一的行分鐘增量enddt」列

+0

我想請你明確寫在NEWCOL在你的問題中設置的值。我無法理解''startdt'和'enddt'列之間的10分鐘增量列。「 –

回答

1

自定義(通用)轉換功能

def transform_func(row, freq, include_last): 
    start = row['startdt'].min() 
    end = row['endt'].max() 
    idx = pd.DatetimeIndex(start=start, end=end, freq=freq) 
    if include_last and idx[-1] != end: 
     idx = idx.append(pd.DatetimeIndex([end])) 
    return pd.DataFrame(data={'newcol': idx}) 

這需要的startend,並基於它DatetimeIndex。您可以指定頻率和間隔是否應該關閉

創建一個特定的變換函數

您可以通過使得原本transfrom_func少通用的,多用途的,functools.partiallambda做到這一點。我選擇的λ

transform_func10 = lambda x: transform_func(x, freq='10Min', include_last=True) 

使用該特定功能

執行聚集

總結

d = df.groupby(['startdt', 'endt']).agg(transform_func10) 

結果

            newcol 
startdt     endt   
2017-05-27 11:30:00  2017-05-27 11:55:00 0  2017-05-27 11:30:00 
               1  2017-05-27 11:40:00 
               2  2017-05-27 11:50:00 
               3  2017-05-27 11:55:00 
2017-05-27 14:54:00  2017-05-27 15:33:00 0  2017-05-27 14:54:00 
               1  2017-05-27 15:04:00 
               2  2017-05-27 15:14:00 
               3  2017-05-27 15:24:00 
               4  2017-05-27 15:33:00 

格式化

d.reset_index().drop('level_2', axis=1).rename(columns={0: 'newcol'})產量:

startdt     endt     newcol 
0 2017-05-27 11:30:00  2017-05-27 11:55:00  2017-05-27 11:30:00 
1 2017-05-27 11:30:00  2017-05-27 11:55:00  2017-05-27 11:40:00 
2 2017-05-27 11:30:00  2017-05-27 11:55:00  2017-05-27 11:50:00 
3 2017-05-27 11:30:00  2017-05-27 11:55:00  2017-05-27 11:55:00 
4 2017-05-27 14:54:00  2017-05-27 15:33:00  2017-05-27 14:54:00 
5 2017-05-27 14:54:00  2017-05-27 15:33:00  2017-05-27 15:04:00 
6 2017-05-27 14:54:00  2017-05-27 15:33:00  2017-05-27 15:14:00 
7 2017-05-27 14:54:00  2017-05-27 15:33:00  2017-05-27 15:24:00 
8 2017-05-27 14:54:00  2017-05-27 15:33:00  2017-05-27 15:33:00 
+0

很好的答案,這個作品非常簡潔。 – PR102012

相關問題