重采样python中的时间戳序列

时间:2018-12-21 22:41:43

标签: python pandas datetime

我有一系列时间戳,如下所示:

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”。

2 个答案:

答案 0 :(得分:1)

您不需要pandas。您可以使用timedeltadatetime对象添加时间间隔。

您可以使用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)))

答案 1 :(得分: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')]