如果它们属于[重复],则创建新行并根据时间间隔重复值

Posted

技术标签:

【中文标题】如果它们属于[重复],则创建新行并根据时间间隔重复值【英文标题】:Create new rows and repeat the values based on time interval if they belong to [duplicate] 【发布时间】:2022-01-23 07:55:14 【问题描述】:

我有一个包含许多列的 Pandas 数据框。其中两个是时间戳startend)。


       start                 end             value  string
    2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 17:00:00     2021-12-01 17:30:00     2   b
    2021-12-01 14:00:00     2021-12-01 16:00:00     3   c

我需要将时间戳标记(下面的 time 列)标准化为 5 到 5 分钟,重复属于同一时间间隔的其他列 valuestring 的值,如下所示:

 

           time                  start               end             value  string
    2021-12-01 14:00:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 14:05:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 14:10:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 14:15:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 14:20:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 14:25:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 14:30:00     2021-12-01 14:00:00     2021-12-01 14:35:00     1   a
    2021-12-01 17:00:00     2021-12-01 17:00:00     2021-12-01 17:30:00     2   b
    2021-12-01 17:05:00     2021-12-01 17:00:00     2021-12-01 17:30:00     2   b

....

时间间隔上有很多交叉点,所以我无法使用df.resampleDatetimeIndex

【问题讨论】:

【参考方案1】:

您可以使用pd.date_range 为每一行创建一个日期范围,然后explode 他们:

new_df = df.assign(time=df.apply(lambda x: pd.date_range(x['start'], x['end'], freq='5min'), axis=1)).explode('time').reset_index(drop=True)

输出:

>>> new
                 start                 end  value string                time
0  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:00:00
1  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:05:00
2  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:10:00
3  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:15:00
4  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:20:00
5  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:25:00
6  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:30:00
7  2021-12-01 14:00:00 2021-12-01 14:35:00      1      a 2021-12-01 14:35:00
8  2021-12-01 17:00:00 2021-12-01 17:30:00      2      b 2021-12-01 17:00:00
9  2021-12-01 17:00:00 2021-12-01 17:30:00      2      b 2021-12-01 17:05:00
...

【讨论】:

谢谢理查德!但我有一个错误“ValueError:值的长度与索引的长度不匹配”。我尝试在 date_range 中使用 closed='left',但错误仍然存​​在。我是 Python 新手。关于这个错误的任何想法? 如果没有您的更多数据,我无法真正告诉您发生了什么。它应该可以工作-我不确定为什么不可以。 :( Richardec,我使用的是旧版本 (0.22.0) 的 Pandas。我升级了版本:1.1.5,您的解决方案完美运行!谢谢!成功安装numpy-1.19.5 pandas-1.1.5 python-dateutil-2.8.2

以上是关于如果它们属于[重复],则创建新行并根据时间间隔重复值的主要内容,如果未能解决你的问题,请参考以下文章

如果列表元素属于某种类型,则遍历列表并打印“真”[重复]

根据前一个垂直居中Bootstrap 3列[重复]

使用两个日期列创建新行并重复总和值

如果相同的列值在多行中重复,则 UPDATE - SQL / MYSQL

AS3如何获取URLRequest以设定的间隔重复操作

Mysql连接表而不重复属于同一行的行