重新采样datetimeIndex开始日期错误

时间:2018-10-31 16:38:33

标签: pandas pandas-groupby

来源:

    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-07-31到2018-04-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])  

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

1 个答案:

答案 0 :(得分:1)

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

示例代码:

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