PANDAs:创造'填充'具有增量日期时间值的列,位于2个日期时间(范围)列之间

时间:2017-05-31 13:26:14

标签: python pandas

我有一个包含2列[' startdt']和[' enddt']的数据框。它们是PANDAs数据帧中的日期时间对象。我想创建一个新列,根据" startdt'的每个组合进行分组。并且' enddt',并在列的行中填充值,其中10分钟的增量值来自" startdt'到/包括' enddt'列。

以下是' startdt'的2个GROUPINGS示例并且' enddt&#39 ;;请注意,分组中的最后一行几乎总是少于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中创建其他2列的重复行,但是在这些行之间会有10个(或者在组的最后一行中更少)的唯一行。并且' enddt'列

1 个答案:

答案 0 :(得分: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来实现此目的。我选择lambda

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