我有一个包含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'列
答案 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})
这需要start
和end
,并根据它生成DatetimeIndex
。您可以指定频率以及是否应关闭间隔
您可以通过使原始transfrom_func
不那么通用和多功能,functools.partial
或lambda
来实现此目的。我选择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