Python 循环时单个位置索引器超出了启用范围

Python 循环时单个位置索引器超出了启用范围,python,pandas,Python,Pandas,我正在打印特定范围内的数据。例如,now+200秒,所以在这里我将在200秒内打印数据 我尝试了一个while循环,即在时间日期+200秒内打印数据。但是,如果数据的时间小于日期+200秒,则在结束时 ,它引发了一个错误“单位置索引器超出范围” file=pd.read\u hdf('KazSTSAT5.h5',mode='r',index\u col='time') df=pd.DataFrame(文件) df['time']=pd.to_datetime(df['time'],单位为秒) 初

我正在打印特定范围内的数据。例如,
now+200秒
,所以在这里我将在200秒内打印数据

我尝试了一个while循环,即在时间日期+200秒内打印数据。但是,如果数据的时间小于日期+200秒,则在结束时 ,它引发了一个错误“单位置索引器超出范围”

file=pd.read\u hdf('KazSTSAT5.h5',mode='r',index\u col='time')
df=pd.DataFrame(文件)
df['time']=pd.to_datetime(df['time'],单位为秒)
初始尺寸=df.size
尽管如此:
df['time']=pd.to_datetime(df['time'],单位为秒)
pd.set_选项('display.max_rows',-1)
#数据帧中的第一个日期
first_datetime=df.iloc[1,1]
#日期范围200秒
i=pd.date\u range(第一个日期时间,周期=200,频率=S')
b=df.loc[(df.time>=i[0])&(df.time
df2=df.loc[df.loc[:,'time']
df2=df.loc[df.loc[:,'time']
如果您只是想知道,当您到达
最小时间
-和
最大时间
-相隔不到200秒的点时,您可以按如下方式进行操作:

# create a date range and convert it to a series
# just make sure, you set the end properly
interval_series= interval_series= pd.date_range(start='2019-09-10 02:18:23', end='2030-08-01 00:00:00', freq='200S').to_series()
interval_series.name= 'interval_time'

# now align that index to your data
# to use the following, you have to make sure,
# your time column is of type datetime64
index_date_df= pd.merge_asof(df[['time']], interval_series, left_on='time', right_index=True)

# now you can use the assigned intrval time,
# which is from the date_range, to group
# your dataframe
# the following example would just take the 
# first row within each 200s slot
index_date_df['interval_time']
df.groupby(index_date_df['interval_time']).agg('first').reset_index(drop=True)
确定循环必须终止的时间点:

mn= df2['time'].min()
mx= df2['time'].max()

td= mx-mn
if td.seconds < 200:
    # do something usefull here to process the rest of data
    break  # exit the loop
这将产生:

Out[78]: 
   country                time
0      USA 2019-09-10 02:18:23
1       MX 2019-09-10 02:24:48
2      USA 2019-09-10 02:25:34
3      USA 2019-09-10 02:29:07
4      USA 2019-09-10 02:32:21
5       MX 2019-09-10 02:38:36
6       MX 2019-09-10 02:43:34
7      USA 2019-09-10 02:47:09
8      USA 2019-09-10 02:48:48
9      USA 2019-09-10 02:55:56
10     USA 2019-09-10 03:01:33
11      MX 2019-09-10 03:02:09
12     USA 2019-09-10 03:05:42
13      MX 2019-09-10 03:09:42
14      MX 2019-09-10 03:12:39
根据以下测试数据:

import io
raw=\
"""   country                time
0      USA 2019-09-10 02:18:23
1      USA 2019-09-10 02:19:53
2       MX 2019-09-10 02:24:48
3      USA 2019-09-10 02:25:34
4      USA 2019-09-10 02:29:07
5       MX 2019-09-10 02:29:43
6      USA 2019-09-10 02:32:21
7      USA 2019-09-10 02:34:58
8       MX 2019-09-10 02:38:36
9       MX 2019-09-10 02:39:49
10      MX 2019-09-10 02:43:34
11      MX 2019-09-10 02:44:51
12     USA 2019-09-10 02:47:09
13     USA 2019-09-10 02:48:11
14     USA 2019-09-10 02:48:48
15      MX 2019-09-10 02:51:19
16     USA 2019-09-10 02:55:56
17     USA 2019-09-10 02:58:17
18     USA 2019-09-10 03:01:33
19      MX 2019-09-10 03:02:09
20     USA 2019-09-10 03:05:42
21     USA 2019-09-10 03:08:00
22      MX 2019-09-10 03:09:42
23      MX 2019-09-10 03:12:39"""

df2= pd.read_fwf(io.StringIO(raw), widths=[3, 8, 20])
df2['time']= df2['time'].astype('datetime64')

如果您只是想知道,当您达到
min
-和
max
-时间间隔小于200秒的点时,您可以按如下方式进行操作:

# create a date range and convert it to a series
# just make sure, you set the end properly
interval_series= interval_series= pd.date_range(start='2019-09-10 02:18:23', end='2030-08-01 00:00:00', freq='200S').to_series()
interval_series.name= 'interval_time'

# now align that index to your data
# to use the following, you have to make sure,
# your time column is of type datetime64
index_date_df= pd.merge_asof(df[['time']], interval_series, left_on='time', right_index=True)

# now you can use the assigned intrval time,
# which is from the date_range, to group
# your dataframe
# the following example would just take the 
# first row within each 200s slot
index_date_df['interval_time']
df.groupby(index_date_df['interval_time']).agg('first').reset_index(drop=True)
确定循环必须终止的时间点:

mn= df2['time'].min()
mx= df2['time'].max()

td= mx-mn
if td.seconds < 200:
    # do something usefull here to process the rest of data
    break  # exit the loop
这将产生:

Out[78]: 
   country                time
0      USA 2019-09-10 02:18:23
1       MX 2019-09-10 02:24:48
2      USA 2019-09-10 02:25:34
3      USA 2019-09-10 02:29:07
4      USA 2019-09-10 02:32:21
5       MX 2019-09-10 02:38:36
6       MX 2019-09-10 02:43:34
7      USA 2019-09-10 02:47:09
8      USA 2019-09-10 02:48:48
9      USA 2019-09-10 02:55:56
10     USA 2019-09-10 03:01:33
11      MX 2019-09-10 03:02:09
12     USA 2019-09-10 03:05:42
13      MX 2019-09-10 03:09:42
14      MX 2019-09-10 03:12:39
根据以下测试数据:

import io
raw=\
"""   country                time
0      USA 2019-09-10 02:18:23
1      USA 2019-09-10 02:19:53
2       MX 2019-09-10 02:24:48
3      USA 2019-09-10 02:25:34
4      USA 2019-09-10 02:29:07
5       MX 2019-09-10 02:29:43
6      USA 2019-09-10 02:32:21
7      USA 2019-09-10 02:34:58
8       MX 2019-09-10 02:38:36
9       MX 2019-09-10 02:39:49
10      MX 2019-09-10 02:43:34
11      MX 2019-09-10 02:44:51
12     USA 2019-09-10 02:47:09
13     USA 2019-09-10 02:48:11
14     USA 2019-09-10 02:48:48
15      MX 2019-09-10 02:51:19
16     USA 2019-09-10 02:55:56
17     USA 2019-09-10 02:58:17
18     USA 2019-09-10 03:01:33
19      MX 2019-09-10 03:02:09
20     USA 2019-09-10 03:05:42
21     USA 2019-09-10 03:08:00
22      MX 2019-09-10 03:09:42
23      MX 2019-09-10 03:12:39"""

df2= pd.read_fwf(io.StringIO(raw), widths=[3, 8, 20])
df2['time']= df2['time'].astype('datetime64')

您可以发布一个示例来说明
df
的样子吗?您好,根据您的变量名,您想在
first\u datetime=df.iloc[1,1]
中设置第一个条目,但是您实际使用了第二行(
.loc[0,1]
将是第一行的第二列)。这是有意的吗?您打算用
pd.concat做什么([df,b,b])。删除重复项(keep=False)
?我想您连接的第二个
b
稍后将被完全删除,因为
删除了重复的
,或者我错过了什么吗?@Aryerez Iuploaded@jottbe因此,据我所知,它从原始日期框中获取请求的数据,并在没有请求数据的情况下创建新的日期框。您能否发布一个示例,说明
df
的外观您好,根据您的变量名,您想在
first\u datetime=df.iloc[1,1]
中设置第一个条目,但实际上您使用了第二行(
.loc[0,1]
将是第一行的第二列)。这是有意的吗?您打算如何处理
pd.concat([df,b,b])。删除重复项(keep=False)
?我想您连接的第二个
b
稍后将被完全删除,因为
删除了重复的
,或者我错过了什么吗?@Aryerez Iuploaded@jottbe因此,据我所知,它从原始日期框中获取请求的数据,并在没有请求数据的情况下创建新的日期框。应该有时间段。应该有时间段