我有一个带有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
答案 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)]