首页 > 解决方案 > 在列中平均分配重复的时间戳

问题描述

给定这个日期2020-01-02重复三遍的数据框

df_original
                 time
0 2020-01-02 00:00:00
1 2020-01-02 00:00:00
2 2020-01-02 00:00:00
3 2020-01-03 00:00:00

我想将其转换为以下内容,其中三个时间戳在和2020-01-02之间平均分布。2020-01-012020-01-02

df_expected
                 time
0 2020-01-01 00:00:00
1 2020-01-01 12:00:00
2 2020-01-02 00:00:00
3 2020-01-03 00:00:00

time对于一列长度为 ~的数据框,是否有一种有效的方法来执行此操作10_000_000

首先,我必须找到重复的时间戳,我想这可以使用df.duplicated(). 然后我将不得不以某种方式遍历所有重复的块并执行以下操作:

pd.date_range(timestamps[0] - Timedelta(days=1), timestamps[0], len(timestamps))

但我不确定如何在不循环的情况下实现这一点。

编辑

添加具有预期输出的额外数据框

df_original
                  time
0  2020-01-01 00:00:00
1  2020-01-02 00:00:00
2  2020-01-02 00:00:00
3  2020-01-03 00:00:00
4  2020-01-03 00:00:00
5  2020-01-03 00:00:00
6  2020-01-04 00:00:00
7  2020-01-04 00:00:00
8  2020-01-04 00:00:00
9  2020-01-04 00:00:00
10 2020-01-05 00:00:00
df_expected
                  time
0  2020-01-01 00:00:00
1  2020-01-01 00:00:00
2  2020-01-02 00:00:00
3  2020-01-02 00:00:00
4  2020-01-02 12:00:00
5  2020-01-03 00:00:00
6  2020-01-03 00:00:00
7  2020-01-03 08:00:00
8  2020-01-03 16:00:00
9  2020-01-04 00:00:00
10 2020-01-05 00:00:00 

这里有一个重要的注意事项是,在这些示例中,我使用Timedelta(days=1)了增量时间来分散重复项,但这个增量可以是任何Timedelta

标签: pythonpandas

解决方案


试试 with groupbycumcount(ascending=False)然后乘以 12 小时:

df['time'] = pd.to_datetime(df['time'])
df['time'] = df['time'] - df.groupby('time').cumcount(ascending=False).mul(pd.Timedelta(hours=12))
print(df)

输出:

                 time
0 2020-01-01 00:00:00
1 2020-01-01 12:00:00
2 2020-01-02 00:00:00
3 2020-01-03 00:00:00

推荐阅读