Python Pandas,仅重新采样特定时间

kro*_*ike 5 python pandas

我的熊猫版本是0.18,我有一个分钟数据,如下所示:

Time                              
2009-01-30 09:30:00  85.11  100.11
2009-01-30 09:39:00  84.93  100.05
2009-01-30 09:40:00  84.90  100.00
2009-01-30 09:45:00  84.91   99.94
2009-01-30 09:48:00  84.81   99.90
2009-01-30 09:55:00  84.78  100.00
2009-01-30 09:56:00  84.57  100.10
2009-01-30 09:59:00  84.25  100.41
2009-01-30 10:00:00  84.32  100.60
2009-01-30 10:06:00  84.23  101.49
2009-01-30 10:09:00  84.15  101.47
Run Code Online (Sandbox Code Playgroud)

我想仅使用9:30和16:00的数据,并以78分钟的间隔重新采样数据(即将9:30到16:00之间的时间分成5个相等的部分).我的代码如下:

Data= Data.between_time('9:30','16:00')
tframe = '78T'
hourlym = Data.resample(tframe, base=30).mean()
Run Code Online (Sandbox Code Playgroud)

输出:

Time                                      
2009-01-30 08:18:00  85.110000  100.110000
2009-01-30 09:36:00  83.950645  101.984516
2009-01-30 10:54:00  83.372294  103.093824
2009-01-30 12:12:00  83.698624  102.566897
2009-01-30 13:30:00  83.224397  103.076667
2009-01-30 14:48:00  82.641167  104.114667
2009-01-30 16:06:00        NaN         NaN
2009-01-30 17:24:00        NaN         NaN
2009-01-30 18:42:00        NaN         NaN
Run Code Online (Sandbox Code Playgroud)

你可以看到pandas忽略了我的基本参数,我的输出表从8:18开始,我相信这是因为pandas寻求如何将我的整个数据正确地分成78分钟,因为你不能将24h分成78分钟同样这种奇怪的行为发生.是否可以强制大熊猫在第1天9:30开始重新取样?或者在重新采样时只在特定时间内工作?

Ian*_*anS 5

base参数应用于午夜,因此在您的情况下,采样从00:30开始,并从该时间开始增加78分钟。我看到两个选择。

选项1

弄清楚base应该应用到午夜的什么时间才能达到9:30(在这种情况下24):

Data.resample(tframe, base=24)
Run Code Online (Sandbox Code Playgroud)

选项2

自己生成datetimeindex,并使用进行重新采样reindex

index = pd.date_range('2009-01-30 09:30:00', '2009-01-30 16:00:00', freq='78min')
Data.reindex(index=index)
Run Code Online (Sandbox Code Playgroud)

编辑:几天后,您将需要自己生成时间戳。

index_date = pd.date_range('2016-04-01', '2016-04-04')
index_date = pd.Series(index_date)
index_time = pd.date_range('09:30:00', '16:00:00', freq='78min')
index_time = pd.Series(index_time.time)

index = index_date.apply(
    lambda d: index_time.apply(
        lambda t: datetime.combine(d, t)
        )
    ).unstack().sort_values().reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

代码是这样的:

  • 生成您感兴趣的日期和时间,并将它们分成系列以具有该apply属性。
  • 使用嵌套的“ applies”,遍历日期和时间,并将它们组合为datetime对象。
  • 输出是一个方形数据帧(每个日期一列),因此我unstack对时间戳进行了排序(最后重置索引以摆脱沿途生成的无用索引)。

结果index可以像最初在选项2中一样用于重新索引:

Data.reindex(index=index)
Run Code Online (Sandbox Code Playgroud)