【问题标题】:resampling a sequence of timestamps in python在python中重新采样一系列时间戳
【发布时间】:2018-12-21 22:41:43
【问题描述】:

我有一个这样的时间戳序列:

from datetime import datetime
dts = [datetime(2018, 12, 21, 10), datetime(2018, 12, 21, 11), datetime(2018, 12, 21, 12)]

它们可能有也可能没有间隔,但每个时间戳代表一个 1 小时的时间段。我想将其重新采样为代表 30 分钟周期的 30 分钟时间戳序列,如下所示: [datetime(2018, 12, 21, 10, 0), datetime(2018, 12, 21, 10, 30), datetime(2018, 12, 21, 11, 0), datetime(2018, 12, 21, 11, 30), datetime(2018, 12, 21, 12, 0), datetime(2018, 12, 21, 12, 30)].

我能得到的最接近的是(ab)使用熊猫:

import pandas as pd
s = pd.Series(dts, index=pd.DatetimeIndex(dts))
s.asfreq('30T').index

这让我得到以下信息

DatetimeIndex(['2018-12-21 10:00:00', '2018-12-21 10:30:00',
               '2018-12-21 11:00:00', '2018-12-21 11:30:00',
               '2018-12-21 12:00:00'],
              dtype='datetime64[ns]', freq='30T')

注意它没有“2018-12-21 12:30:00”。

【问题讨论】:

  • 澄清一下:在这种情况下,时间戳是每小时一次,我想要的频率是每 30 分钟一次,没有间隔,但在我试图实现的一般情况下,可能会有间隔,源和目标频率是任意的。
  • 我想出了一个考虑到差距的部分解决方案。限制是这仅在从较低频率到较高频率时才有效。 times = pd.IntervalIndex.from_tuples( [(t, t + dt.timedelta(hours=1)) for t in sorted(dts)], closed='left'); newtimes = pd.interval_range(start=times.left[0], end=times.right[-1], freq='30min', closed='left'); newtimes = newtimes[[times.contains(t) for t in newtimes]].left.tolist()

标签: python pandas datetime


【解决方案1】:

使用date_range

pd.date_range(start=dts[0],end=dts[-1]+pd.Timedelta('30min'),freq='30min').tolist()
Out[203]: 
[Timestamp('2018-12-21 10:00:00', freq='30T'),
 Timestamp('2018-12-21 10:30:00', freq='30T'),
 Timestamp('2018-12-21 11:00:00', freq='30T'),
 Timestamp('2018-12-21 11:30:00', freq='30T'),
 Timestamp('2018-12-21 12:00:00', freq='30T'),
 Timestamp('2018-12-21 12:30:00', freq='30T')]

【讨论】:

    【解决方案2】:

    您不需要pandas。您可以使用timedelta 将时间间隔添加到datetime 对象。

    您可以使用map 将间隔应用于dts 中的每个元素,然后使用ziplist 创建一个新的交错列表。

    from datetime import datetime
    from datetime import timedelta
    
    dts = [datetime(2018, 12, 21, 10), datetime(2018, 12, 21, 11), datetime(2018, 12, 21, 12)]
    
    new_dts = list(zip(dts, map(lambda x: x + timedelta(minutes=30), dts)))
    

    【讨论】:

    • 这个返回的元组列表你想把它展平吗?
    • 很公平。编辑生成平面列表
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2015-05-30
    • 2021-04-15
    • 1970-01-01
    • 2021-06-26
    • 2017-06-04
    相关资源
    最近更新 更多