如何将每小时的第一行从熊猫数据框提取到新数据框

时间:2019-06-12 16:15:00

标签: python pandas

我有一个带有Datetime索引和其他3列的数据框,如下所示:

import numpy as np
df = pd.DataFrame({'DateTime': pd.date_range('1/1/2012', periods=20, freq=pd.offsets.Minute(n=15))})
df['Data1'] = np.random.randint(0, 500, len(df))
df['Data2'] = np.random.randint(0, 500, len(df))
df['Data3'] = np.random.randint(0, 500, len(df))


              DateTime  Data1  Data2  Data3
0  2012-01-01 00:00:00    130    297    240
1  2012-01-01 00:15:00    408    121    480
2  2012-01-01 00:30:00    120    341     67
3  2012-01-01 00:45:00     80    123    418
4  2012-01-01 01:00:00    413    394    242
5  2012-01-01 01:15:00    339    338    440
6  2012-01-01 01:30:00    101    435    414
7  2012-01-01 01:45:00    359     55    449
8  2012-01-01 02:00:00    122    267    217
9  2012-01-01 02:15:00    117     60      1
10 2012-01-01 02:30:00    456    167    178
11 2012-01-01 02:45:00    236    256     84
12 2012-01-01 03:00:00    308    187    110
13 2012-01-01 03:15:00    426    134      1
14 2012-01-01 03:30:00    185    424    472
15 2012-01-01 03:45:00    269    198    346
16 2012-01-01 04:00:00    213    349    166
17 2012-01-01 04:15:00    477     77    406
18 2012-01-01 04:30:00    412    210    492
19 2012-01-01 04:45:00     44    337     88

如何将每小时的第一行提取到一个新的数据框中?我不要求和或平均值。每小时每小时仅排在第一行,如下所示。

              DateTime  Data1  Data2  Data3
0  2012-01-01 00:00:00    130    297    240
1  2012-01-01 01:00:00    413    394    242
2  2012-01-01 02:00:00    122    267    217
3  2012-01-01 03:00:00    308    187    110
4  2012-01-01 04:00:00    213    349    166

4 个答案:

答案 0 :(得分:3)

您可以将df.groupby()下的keys下的pd.Grouper()用作要分组的列名称:

df.groupby(pd.Grouper(key='DateTime',freq='60Min')).first().reset_index()

             DateTime  Data1  Data2  Data3
0 2012-01-01 00:00:00    130    297    240
1 2012-01-01 01:00:00    413    394    242
2 2012-01-01 02:00:00    122    267    217
3 2012-01-01 03:00:00    308    187    110
4 2012-01-01 04:00:00    213    349    166

答案 1 :(得分:2)

我会使用:

df.groupby(df.DateTime.dt.floor('H')).first()

您上面的示例数据框没有DatetimeIndex,您有dtype为datetime的列,但它不在索引中。但是,如果将DateTime移到索引中,则可以使用以下语法进行同样的操作:

df = df.set_index('DateTime')
df.loc[df.index.floor('H').drop_duplicates()]

df.groupby(df.index.floor('H')).first()

答案 2 :(得分:2)

另一种选择是使用Series.duplicated,它只需对您的DataFrame进行最少的修改:

df[~df['DateTime'].dt.floor('H').duplicated()]

              DateTime  Data1  Data2  Data3
0  2012-01-01 00:00:00    130    297    240
4  2012-01-01 01:00:00    413    394    242
8  2012-01-01 02:00:00    122    267    217
12 2012-01-01 03:00:00    308    187    110
16 2012-01-01 04:00:00    213    349    166

答案 3 :(得分:1)

如果几秒钟内没有变化

new_df=df[df.DateTime.apply(lambda x: x.minute==0)]