首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按照熊猫的日期索引来划分我的“时间推定”功能

如何按照熊猫的日期索引来划分我的“时间推定”功能
EN

Stack Overflow用户
提问于 2021-06-15 14:07:09
回答 1查看 38关注 0票数 0

我在我的熊猫5分钟间隔数据帧中有一个基于时间的功能,所以它看起来就像

代码语言:javascript
复制
      dataDate               TimeconinSec

     2020-11-11 22:25:00     302
     2020-11-11 23:25:00     605
     2020-11-12 00:25:00     302

这个特性有几次值可能超过5分钟(300秒),所以我希望它类似于下面的输出,返回时间并分发时间特性

代码语言:javascript
复制
    dataDate               TimeconinSec

     2020-11-11 22:20:00     300
     2020-11-11 22:25:00     002
     2020-11-11 23:15:00     300
     2020-11-11 23:20:00     300
     2020-11-11 23:25:00     005
     2020-11-12 00:20:00     300 
     2020-11-12 00:25:00     002

我尝试过不同的熊猫日期范围函数,但是如何将基于时间的功能划分到不同的时间间隔中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-15 14:35:37

让我们首先将所有内容转换为适当的时间戳,并计算每个间隔的开始和结束:

代码语言:javascript
复制
>>> df['date'] = pd.to_datetime(df['dataDate'])
>>> df['since'] = (df['date'] - df['TimeconinSec'].astype('timedelta64[s]')).dt.floor(freq='300s')
>>> df['until'] = df['since'] + df['TimeconinSec'].astype('timedelta64[s]')

然后,我们可以使用pd.date_range生成所有适当的中间区间界限:

代码语言:javascript
复制
>>> bounds = df.apply(lambda s: [*pd.date_range(s['since'], s['until'], freq='300s'), s['until']], axis='columns')
>>> bounds
0    [2020-11-11 22:15:00, 2020-11-11 22:20:00, 202...
1    [2020-11-11 23:10:00, 2020-11-11 23:15:00, 202...
2    [2020-11-12 00:15:00, 2020-11-12 00:20:00, 202...
dtype: object

然后,使用explode,我们可以将它们制作成自己的系列。我使用了两次这个系列,一次用于间隔的开始,一次用于结束,因此发生了变化。注意groupby().shift(),它只允许在同一索引内执行移位。

代码语言:javascript
复制
>>> interval_ends = pd.concat([bounds.explode(), bounds.explode().groupby(level=0).shift(-1)], axis='columns', keys=['start', 'end'])
>>> interval_ends
                start                 end
0 2020-11-11 22:15:00 2020-11-11 22:20:00
0 2020-11-11 22:20:00 2020-11-11 22:20:02
0 2020-11-11 22:20:02                 NaT
1 2020-11-11 23:10:00 2020-11-11 23:15:00
1 2020-11-11 23:15:00 2020-11-11 23:20:00
1 2020-11-11 23:20:00 2020-11-11 23:20:05
1 2020-11-11 23:20:05                 NaT
2 2020-11-12 00:15:00 2020-11-12 00:20:00
2 2020-11-12 00:20:00 2020-11-12 00:20:02
2 2020-11-12 00:20:02                 NaT

在此之后,我们可以丢弃索引,只需计算每个间隔内的时间:

代码语言:javascript
复制
>>> interval_ends.reset_index(drop=True, inplace=True)
>>> delays = (interval_ends['end'] - interval_ends['start']).astype('timedelta64[s]')
>>> delays
0    300.0
1      2.0
2      NaN
3    300.0
4    300.0
5      5.0
6      NaN
7    300.0
8      2.0
9      NaN
dtype: float64

最后,我们只需加入从这些延迟开始的间隔,并删除包含NaN的行,我们就得到了最后的结果:

代码语言:javascript
复制
>>> delays = delays.rename('time_in_secs').dropna().astype('int')
>>> interval_ends[['start']].join(delays, how='inner')
                start  time_in_secs
0 2020-11-11 22:15:00           300
1 2020-11-11 22:20:00             2
3 2020-11-11 23:10:00           300
4 2020-11-11 23:15:00           300
5 2020-11-11 23:20:00             5
7 2020-11-12 00:15:00           300
8 2020-11-12 00:20:00             2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67987884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档