Python 对数据帧的x行求和并替换

Python 对数据帧的x行求和并替换,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: Date from Date to Actuals 4669 2017-12-22 06:00:00 2017-12-22 06:05:00 75 4670 2017-12-22 06:05:00 2017-12-22 06:10:00 81 4671 2017-12-22 06:10:00 2017-12-22 06:15:00 84 4672 2017-12-22 06:1

我有以下数据帧:

                Date from             Date to  Actuals
4669  2017-12-22 06:00:00 2017-12-22 06:05:00       75
4670  2017-12-22 06:05:00 2017-12-22 06:10:00       81
4671  2017-12-22 06:10:00 2017-12-22 06:15:00       84
4672  2017-12-22 06:15:00 2017-12-22 06:20:00       78
4673  2017-12-22 06:20:00 2017-12-22 06:25:00       93
4674  2017-12-22 06:25:00 2017-12-22 06:30:00       93
4675  2017-12-22 06:30:00 2017-12-22 06:35:00       99
4676  2017-12-22 06:35:00 2017-12-22 06:40:00      102
4677  2017-12-22 06:40:00 2017-12-22 06:45:00      102
4678  2017-12-22 06:45:00 2017-12-22 06:50:00      108
4679  2017-12-22 06:50:00 2017-12-22 06:55:00      129
4680  2017-12-22 06:55:00 2017-12-22 07:00:00      135
4681  2017-12-22 07:00:00 2017-12-22 07:05:00      126
4682  2017-12-22 07:05:00 2017-12-22 07:10:00      111
4683  2017-12-22 07:10:00 2017-12-22 07:15:00       96
4684  2017-12-22 07:15:00 2017-12-22 07:20:00      111
4685  2017-12-22 07:20:00 2017-12-22 07:25:00      105
4686  2017-12-22 07:25:00 2017-12-22 07:30:00       99
4687  2017-12-22 07:30:00 2017-12-22 07:35:00      111
4688  2017-12-22 07:35:00 2017-12-22 07:40:00      129
4689  2017-12-22 07:40:00 2017-12-22 07:45:00      123
4690  2017-12-22 07:45:00 2017-12-22 07:50:00      138
4691  2017-12-22 07:50:00 2017-12-22 07:55:00      141
4692  2017-12-22 07:55:00 2017-12-22 08:00:00      156
4693  2017-12-22 08:00:00 2017-12-22 08:05:00      147
4694  2017-12-22 08:05:00 2017-12-22 08:10:00      120
4695  2017-12-22 08:10:00 2017-12-22 08:15:00       99
4696  2017-12-22 08:15:00 2017-12-22 08:20:00       75
4697  2017-12-22 08:20:00 2017-12-22 08:25:00       57
4698  2017-12-22 08:25:00 2017-12-22 08:30:00       45
                  ...                 ...      ...
53855 2018-10-08 03:30:00 2018-10-08 03:35:00        0
53856 2018-10-08 03:35:00 2018-10-08 03:40:00        0
53857 2018-10-08 03:40:00 2018-10-08 03:45:00        0
53858 2018-10-08 03:45:00 2018-10-08 03:50:00        0
53859 2018-10-08 03:50:00 2018-10-08 03:55:00        0
53860 2018-10-08 03:55:00 2018-10-08 04:00:00        0
53861 2018-10-08 04:00:00 2018-10-08 04:05:00        0
53862 2018-10-08 04:05:00 2018-10-08 04:10:00        0
53863 2018-10-08 04:10:00 2018-10-08 04:15:00        0
53864 2018-10-08 04:15:00 2018-10-08 04:20:00        0
53865 2018-10-08 04:20:00 2018-10-08 04:25:00        0
53866 2018-10-08 04:25:00 2018-10-08 04:30:00        0
53867 2018-10-08 04:30:00 2018-10-08 04:35:00        0
53868 2018-10-08 04:35:00 2018-10-08 04:40:00        0
53869 2018-10-08 04:40:00 2018-10-08 04:45:00        0
53870 2018-10-08 04:45:00 2018-10-08 04:50:00        0
53871 2018-10-08 04:50:00 2018-10-08 04:55:00        0
53872 2018-10-08 04:55:00 2018-10-08 05:00:00        0
53873 2018-10-08 05:00:00 2018-10-08 05:05:00        0
53874 2018-10-08 05:05:00 2018-10-08 05:10:00        0
53875 2018-10-08 05:10:00 2018-10-08 05:15:00        0
53876 2018-10-08 05:15:00 2018-10-08 05:20:00        0
53877 2018-10-08 05:20:00 2018-10-08 05:25:00        0
53878 2018-10-08 05:25:00 2018-10-08 05:30:00        0
53879 2018-10-08 05:30:00 2018-10-08 05:35:00        0
53880 2018-10-08 05:35:00 2018-10-08 05:40:00        0
53881 2018-10-08 05:40:00 2018-10-08 05:45:00        0
53882 2018-10-08 05:45:00 2018-10-08 05:50:00        0
53883 2018-10-08 05:50:00 2018-10-08 05:55:00        1
53884 2018-10-08 05:55:00 2018-10-08 06:00:00        0

[83324 rows x 3 columns]
我想添加行,以便获得每小时的累积值。预期结果:

             Date from             Date to  Actuals
1  2017-12-22 06:00:00 2017-12-22 07:00:00     1179
2  2017-12-22 07:00:00 2017-12-22 08:00:00     1157
                  ...                 ...      ...
1000 2018-10-08 05:00:00 2018-10-08 06:00:00      1
我使用
DataFrame.sum()
尝试了这一点,但我只能在对完整列进行求和时,而不能基于
datetime
对子部分进行求和。有什么建议吗

ps:在这种情况下,数据帧中每5分钟有一行。但我可以想象,如果不是这样的话,这应该是可能的


编辑:使用统计系主任的答案,我发现这不是一个完美的填充数据框。

您可以注意到的一件事是,您必须一次对12项求和。因此,一个解决方案是遍历数据帧,一次求和12个术语,从第一个术语开始,从最后一个术语停止。你只需要小心边界。让我们调用您的数据帧df

n = df.shape[0]//12 # The number of row you'll have
cumulative = np.zeros(n)
date_from = []
date_to = []
# Now go through the dataframe 12 steps at a time
for i in range(n):
    cumulative[i] = df.iloc[12*i:12*(i+1),2].sum() # Get the sum for the hour
    date_from.append(df.iloc[12*i,0]) # Get the starting instant
    date_to.append(df.iloc[12*i+11,1]) # Get the ending instant
# Now create your new dataframe
new_df = pd.DataFrame({Date_from: date_from, Date_to: date_to, Actuals: cumulative})

正如我前面所说,这只适用于正确的边界(第一行是一个小时的开始),并一直持续到最后一个整小时。

您可以注意到的一点是,您必须一次求和12项。因此,一个解决方案是遍历数据帧,一次求和12个术语,从第一个术语开始,从最后一个术语停止。你只需要小心边界。让我们调用您的数据帧df

n = df.shape[0]//12 # The number of row you'll have
cumulative = np.zeros(n)
date_from = []
date_to = []
# Now go through the dataframe 12 steps at a time
for i in range(n):
    cumulative[i] = df.iloc[12*i:12*(i+1),2].sum() # Get the sum for the hour
    date_from.append(df.iloc[12*i,0]) # Get the starting instant
    date_to.append(df.iloc[12*i+11,1]) # Get the ending instant
# Now create your new dataframe
new_df = pd.DataFrame({Date_from: date_from, Date_to: date_to, Actuals: cumulative})
正如我前面所说的,这只适用于正确的边界(第一行是一个小时的开始),并一直持续到最后一个整小时。

这是一条简单的路线(尽管输出的结构与您所要求的不完全相同,但很容易操作)就是使用
pandas.Grouper
groupby
小时,然后对实际值求和,即

import pandas
import random

#Creating the data frame
d = pandas.date_range('2017-12-22 06:00:00', periods = 50, freq = '5min')
d1 = pandas.date_range('2017-12-22 06:05:00', periods = 50, freq = '5min')
d2 = random.sample(range(1000), 50)
df = pandas.DataFrame({'Date_From':d, 
                       'Date_To':d1, 
                       'Actuals':d2})

(df
  .set_index('Date_From')
  .groupby(pandas.Grouper(freq = 'H'))['Actuals']
  .sum())
这就给了,

一个简单的方法是(虽然输出的结构与您所要求的不完全相同,但很容易操作)使用
pandas.Grouper
groupby
小时,然后对实际值求和,即

import pandas
import random

#Creating the data frame
d = pandas.date_range('2017-12-22 06:00:00', periods = 50, freq = '5min')
d1 = pandas.date_range('2017-12-22 06:05:00', periods = 50, freq = '5min')
d2 = random.sample(range(1000), 50)
df = pandas.DataFrame({'Date_From':d, 
                       'Date_To':d1, 
                       'Actuals':d2})

(df
  .set_index('Date_From')
  .groupby(pandas.Grouper(freq = 'H'))['Actuals']
  .sum())
这就给了,


是的,这确实适用于完全填充的数据帧,正如我在ps中所说的,完全填充的数据帧是可取的,但通常不现实。这也不是基于
datetime
的值求和,而是基于它们的索引,这意味着它是从一个完整的小时开始并以一个完整的小时结束的完美填充和索引。好的,那么解决方案是创建一个包含日期间隔小时的新列。然后在此列上执行groupby和sum。是的,这对完全填充的数据帧有效,正如我在ps中所说的,完全填充的数据帧是可取的,但通常不现实。这也不是基于
datetime
的值求和,而是基于它们的索引,这意味着它是从一个完整的小时开始并以一个完整的小时结束的完美填充和索引。好的,那么解决方案是创建一个包含日期间隔小时的新列。然后在此列上执行groupby和sum。