2017-05-31 78 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

相关问题