python - 在列中平均分配重复的时间戳
问题描述
给定这个日期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-01
2020-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
值
解决方案
试试 with groupby
,cumcount(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
推荐阅读
- android - 如何在 Flutter 中创建自定义动画启动屏幕
- xcode - 如何为 Flutter 添加额外的 iOS 模拟器?
- angular - 滚动到部分通过
- karate - 是否可以在空手道中为 WebUI 自动化执行性能测试?
- python - 如何将值分配给字典中的键?解决算法
- c# - HttpClient GetAsync 耗时约 2 秒
- c# - HttpClient.PostAsJsonAsync 无法从 ASPX 工作的问题
- postman - DocuSignAPI - 通过 API 签署信封
- r - 如何循环遍历参数值、运行函数和保存结果
- python - 无法通过 del 函数删除 DataFrame Pandas 中的列