Python 如何从大型数据集中提取每天每小时500个条目?

Python 如何从大型数据集中提取每天每小时500个条目?,python,python-2.7,pandas,Python,Python 2.7,Pandas,我有一个数据框,有将近200万个条目。我想创建此数据帧的子集 特别是,我想要的是在数据集中每天每小时获取500个条目。结果应保存在新的数据框res中。有一个名为datetime\u event的列,创建dates如下dates=pd.to\u datetime(df['datetime\u event']) 这是我的代码,但需要很多小时才能完成。是否可以稍微优化它,例如使用apply和lambda counter = 0 current_hour = 0 res = pd.DataFrame(c

我有一个数据框,有将近200万个条目。我想创建此数据帧的子集

特别是,我想要的是在数据集中每天每小时获取500个条目。结果应保存在新的数据框
res
中。有一个名为
datetime\u event
的列,创建
dates
如下
dates=pd.to\u datetime(df['datetime\u event'])

这是我的代码,但需要很多小时才能完成。是否可以稍微优化它,例如使用
apply
lambda

counter = 0
current_hour = 0
res = pd.DataFrame(columns=df.columns)
for i in range(0,len(df.index)):
   hour = dates.dt.hour[i]
   if current_hour != hour:
       current_hour = hour
       counter = 0
   if counter <= 500:
       res.loc[i] = df.loc[i]
       counter += 1
我想得到一个子集
res
,它将包含每小时的前N个条目(例如,如下面示例中的前3个条目):


更新:

In [22]: df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
Out[22]:
   id       datetime_event title
0  11  2017-05-01T00:00:08   AAA
1  12  2017-05-01T00:00:08   BBB
2  13  2017-05-01T00:00:08   CCC
5  16  2017-05-01T01:01:00   EEE
6  17  2017-05-01T01:01:01   EEE
7  18  2017-05-01T01:01:09   DDD

更新:

In [22]: df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
Out[22]:
   id       datetime_event title
0  11  2017-05-01T00:00:08   AAA
1  12  2017-05-01T00:00:08   BBB
2  13  2017-05-01T00:00:08   CCC
5  16  2017-05-01T01:01:00   EEE
6  17  2017-05-01T01:01:01   EEE
7  18  2017-05-01T01:01:09   DDD
使用:

df=df[df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')).cumcount()<3]
打印(df)
id日期时间\事件标题
0 11 2017-05-01T00:00:08 AAA
1122017-05-01T00:00:08英国广播公司
21312017-05-01T00:00:08中央空调
516 2017-05-01T01:01:00 EEE
617 2017-05-01T01:01:01 EEE
718 2017-05-01T01:01:09 DDD
计时

df = pd.DataFrame({'datetime_event':pd.date_range('2000-01-01', freq='2T', periods=10**5)})

df['val'] = np.arange(len(df))


In [29]: %timeit df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
100 loops, best of 3: 15.8 ms per loop

In [30]: %timeit df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 3]
100 loops, best of 3: 15.8 ms per loop
df=pd.DataFrame({'datetime_event':pd.date_range('2000-01-01',freq='2T',periods=10**5)})
df['val']=np.arange(len(df))
在[29]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路15.8毫秒
在[30]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路15.8毫秒

df=pd.DataFrame({'datetime_event':pd.date_range('2000-01-01',freq='2S',periods=10**5)})
df['val']=np.arange(len(df))
在[33]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路14.1毫秒
在[34]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路14.5毫秒
使用:

df=df[df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')).cumcount()<3]
打印(df)
id日期时间\事件标题
0 11 2017-05-01T00:00:08 AAA
1122017-05-01T00:00:08英国广播公司
21312017-05-01T00:00:08中央空调
516 2017-05-01T01:01:00 EEE
617 2017-05-01T01:01:01 EEE
718 2017-05-01T01:01:09 DDD
计时

df = pd.DataFrame({'datetime_event':pd.date_range('2000-01-01', freq='2T', periods=10**5)})

df['val'] = np.arange(len(df))


In [29]: %timeit df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
100 loops, best of 3: 15.8 ms per loop

In [30]: %timeit df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 3]
100 loops, best of 3: 15.8 ms per loop
df=pd.DataFrame({'datetime_event':pd.date_range('2000-01-01',freq='2T',periods=10**5)})
df['val']=np.arange(len(df))
在[29]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路15.8毫秒
在[30]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路15.8毫秒

df=pd.DataFrame({'datetime_event':pd.date_range('2000-01-01',freq='2S',periods=10**5)})
df['val']=np.arange(len(df))
在[33]中:%timeit df.groupby(pd.to_datetime(df['datetime_event'])).dt.floor('H')。head(3)
100个回路,最佳3个:每个回路14.1毫秒
在[34]:%timeit df[df.groupby(pd.to_datetime(df['datetime\u event'])).dt.floor('H')).cumcount()<3]
100个回路,最佳3个:每个回路14.5毫秒

您能否添加一些样本数据和所需输出,例如3个条目,而不是500个可验证样本?@jezrael:请检查我的更新。问题在于在使用
for
循环时计算时间过长,我想找到一些可以减少这一时间的解决方案。您能否添加一些样本数据和所需的输出,例如3个条目,而不是500个可验证样本?@jezrael:请检查我的更新。问题在于使用
for
循环时计算时间长,我想找到一些可以减少这一时间的解决方案。好主意,我尝试了。虽然两种解决方案都很好,但我更喜欢这一种,因为在这种情况下,我不需要创建新列
val
@diologius,请检查我答案中的更新部分-我没有在那里添加新列…;-)好主意,我尝试了。虽然两种解决方案都很好,但我更喜欢这一种,因为在这种情况下,我不需要创建新列
val
@degonalius,请检查我答案中的更新部分-我没有在那里添加新列…;-)更新很好。不幸的是,我不能接受两个答案:)非常感谢。@Digoraius,当然,没问题:)更新很好。不幸的是,我不能接受两个答案:)非常感谢。@Digonalius,当然,没问题:)
df = pd.DataFrame({'datetime_event':pd.date_range('2000-01-01', freq='2T', periods=10**5)})

df['val'] = np.arange(len(df))


In [29]: %timeit df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
100 loops, best of 3: 15.8 ms per loop

In [30]: %timeit df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 3]
100 loops, best of 3: 15.8 ms per loop
df = pd.DataFrame({'datetime_event':pd.date_range('2000-01-01', freq='2S', periods=10**5)})

df['val'] = np.arange(len(df))

In [33]: %timeit df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).head(3)
100 loops, best of 3: 14.1 ms per loop

In [34]: %timeit df[df.groupby(pd.to_datetime(df['datetime_event']).dt.floor('H')).cumcount() < 3]
100 loops, best of 3: 14.5 ms per loop