Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中对时间戳序列重新采样_Python_Pandas_Datetime - Fatal编程技术网

在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()