在python中对时间戳序列重新采样
我有一系列这样的时间戳:在python中对时间戳序列重新采样,python,pandas,datetime,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分钟的周期,如下所示: [日期时间(2018,12,21,10,0)、日期时间(2018,12,21,10,30)
from datetime import datetime
dts = [datetime(2018, 12, 21, 10), datetime(2018, 12, 21, 11), datetime(2018, 12, 21, 12)]
它们可能有间隙,也可能没有间隙,但每个时间戳表示一个1小时的时间段。我想将其重新采样为30分钟的时间戳序列,表示30分钟的周期,如下所示:
[日期时间(2018,12,21,10,0)、日期时间(2018,12,21,10,30)、日期时间(2018,12,21,11,0)、日期时间(2018,12,21,11,30)、日期时间(2018,12,21,12,0)、日期时间(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”。您不需要
pandas
。您可以使用timedelta
向datetime
对象添加时间间隔
您可以使用map
将间隔应用于dts
中的每个元素,然后使用zip
和list
创建新的交错列表
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)))
您不需要
熊猫
。您可以使用timedelta
向datetime
对象添加时间间隔
您可以使用map
将间隔应用于dts
中的每个元素,然后使用zip
和list
创建新的交错列表
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)))
使用
date\u范围
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')]
使用
date\u范围
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')]
这个元组的返回列表你想把它展平吗?很公平。编辑以生成展开列表此返回的元组列表是否展开?很公平。编辑以生成平面列表有点澄清:在这种情况下,时间戳是hourlies,我想要的频率是30分钟,没有间隔,但在我试图实现的一般情况下,可能会有间隔,源频率和目标频率是任意的。我找到了一个考虑到间隔的部分解决方案。限制是,这只在从较低频率到较高频率时有效<代码>时间=pd.IntervalIndex.从t元组([(t,t+dt.timedelta(小时=1)),对于排序(dts)]中的t,关闭='left');新时间=pd.interval_range(开始=次.左[0],结束=次.右[-1],频率=30分钟,关闭=左];newtimes=newtimes[[times.contains(t)for t in newtimes]].left.tolist()有点澄清:在这种情况下,时间戳是小时,我想要的频率是30分钟,没有间隔,但在我试图实现的一般情况下,可能会有间隔,源频率和目标频率是任意的。我找到了一个考虑间隙的部分解决方案。限制是,这只在从较低频率到较高频率时有效<代码>时间=pd.IntervalIndex.从t元组([(t,t+dt.timedelta(小时=1)),对于排序(dts)]中的t,关闭='left');新时间=pd.interval_range(开始=次.左[0],结束=次.右[-1],频率=30分钟,关闭=左];newtimes=newtimes[[times.contains(t)表示newtimes中的t]].left.tolist()