首页 > 解决方案 > 重新采样 datetimeIndex 开始日期错误

问题描述

资源:

    import pandas as pd
    import numpy as np

    cols = ['Date', 'Time', 'Load', 'Battery', 'Panel',
           'Wind', 'Temp', 'Humidity', 'Volt']
    data = pd.read_csv('test.csv',delimiter=';',header=0,names=cols,
                        decimal=',',parse_dates[[0,1]],
                        infer_datetime_format=True)
    data.set_index('Date_Time',inplace=True)

我有这个数据框:

In [126]: data.head()                                                                          
Out[126]: 
                     Load  Battery  Panel  Wind   Temp  Humidity  Volt
Date_Time                                                             
2018-07-31 13:07:15  13.3    326.3  353.1  0.98  33.93     21.92  3.89
2018-07-31 13:08:15  14.0    314.4  342.5  0.59  33.88     21.84  3.88
2018-07-31 13:09:16  13.4    309.6  335.5  0.39  33.84     22.14  3.88
2018-07-31 13:10:16  13.8    285.1  313.8  2.55  33.71     23.18  3.88
2018-07-31 13:11:16  13.6    292.9  314.7  2.03  33.62     23.25  3.88
......

与其他 93000 行。从 2018 年 7 月 31 日到 2018 年 4 月 10 日。我想通过对每 10 分钟帧取值的总和来重新采样。所以我尝试了:

In [127]: data.resample('10min',closed='left',label='left').sum()                              
Out[127]: 
                      Load  Battery  Panel   Wind    Temp  Humidity   Volt
Date_Time                                                                 
2018-01-08 00:00:00  136.9   -140.6   -2.9  19.06  291.27    245.63  39.45
2018-01-08 00:10:00  137.3   -140.7   -3.1  15.14  290.62    244.88  39.42
2018-01-08 00:20:00  137.4   -140.4   -2.3  18.03  288.61    246.44  39.44
2018-01-08 00:30:00  137.5   -140.4   -2.2  12.61  286.97    246.83  39.43

这接近我的预期,但是“重新采样”会删除第一天的所有数据(我怀疑可能是因为该系列不是从午夜开始的),重新采样的正确方法是什么?有两个问题:

  1. 结果中缺少第一天,即删除了所有数据,重新采样的数据帧从 8 月 1 日开始,而不是 07/31 开始。

  2. 可以考虑从午夜开始的间隔,并且是 10 分钟的完美倍数(所以,对于 00:00、10:00、20:00 来说可以),但我希望第一个分组是:


2018-07-31 13:07:15  13.3    326.3  353.1  0.98  33.93     21.92  3.89
2018-07-31 13:08:15  14.0    314.4  342.5  0.59  33.88     21.84  3.88
2018-07-31 13:09:16  13.4    309.6  335.5  0.39  33.84     22.14  3.88

然后从 13:10:16 开始,当然是在数据集的第一天,而不是在第二天。好的。我使用以下方法解决了它:

x = data['2018-07-31'].resample('10min').sum()
y = data.resample('10min',closed='left',label='left').sum()
r = pd.concat([x,y])  

但我认为这一定是重采样中的一种错误形式。

标签: pandaspandas-groupby

解决方案


对于恰好从 2018-07-31 13:07:15 开始的输出,您需要添加参数base:“聚合间隔的起源”:文档

示例代码:

start = pd.to_datetime('2018-07-31 13:07:15', format='%Y-%m-%d %H:%M:%S')

minutes = pd.date_range(start, start + timedelta(10), freq='min')

df = pd.DataFrame({'Date_Time': minutes, 'Load': np.random.randint(13, size=len(minutes))})

df.set_index('Date_Time', inplace=True)

df.resample('10min', closed='left', label='left', base=7.25).sum()

结果:

Date_Time           Load       
2018-07-31 13:07:15 11
2018-07-31 13:17:15 1
2018-07-31 13:27:15 6

推荐阅读