重采样时间序列的中心日期时间

时间:2017-11-20 15:10:06

标签: python pandas

当我重新采样Pandas时间序列以减少数据点的数量时,每个结果数据点的时间戳位于每个重采样箱的开始处。当过度绘制具有不同重采样率的图形时,这会导致数据明显偏移。我怎样才能"居中"重新采样数据在其bin中的时间戳,无论重采样率如何?

我现在得到的是(重新采样到一小时时):

In [12]: d_r.head()
Out[12]: 
2017-01-01 00:00:00    0.330567
2017-01-01 01:00:00    0.846968
2017-01-01 02:00:00    0.965027
2017-01-01 03:00:00    0.629218
2017-01-01 04:00:00   -0.002522
Freq: H, dtype: float64

我想要的是:

In [12]: d_r.head()
Out[12]: 
2017-01-01 00:30:00    0.330567
2017-01-01 01:30:00    0.846968
2017-01-01 02:30:00    0.965027
2017-01-01 03:30:00    0.629218
2017-01-01 04:30:00   -0.002522
Freq: H, dtype: float64

MWE显示出适当的转变:

#!/usr/bin/env python3
Minimal working example:

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
import seaborn
seaborn.set()

plt.ion()

# sample data
t = pd.date_range('2017-01-01 00:00', '2017-01-01 10:00', freq='1min')
d = pd.Series(np.sin(np.linspace(0, 7, len(t))), index=t)


d_r = d.resample('1h').mean()

d.plot()
d_r.plot()

Apparent shift of resampled data

2 个答案:

答案 0 :(得分:0)

如果只用timedelta添加30分钟来索引?

<?php     
$date = new DateTime("2017-11-20 00:01:30");
$date->modify("-3 seconds");
echo $date->format("H:i:s");
//output :00:01:27

答案 1 :(得分:0)

我一般都不知道如何使用中点。有label - 参数,但只有rightleft选项。但是,在具体情况下,您可以使用loffset - 参数显式偏移重新采样的时间戳:

d.resample('1h', loffset='30min').mean()

(编辑:使用30min代替30T,因为它更具可读性:http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases