Python 获取高于特定unix时间戳的有序CSV文件中的行号的有效方法

Python 获取高于特定unix时间戳的有序CSV文件中的行号的有效方法,python,csv,search,pandas,Python,Csv,Search,Pandas,我有一个非常大的CSV文件,格式为第一列是一个unix时间戳,已经从最低到最高排序 1461568570,2977.320000000000,0.032000000000 1461568570,2977.320000000000,0.076000000000 1461568570,2977.320000000000,0.076000000000 1461568569,2977.050000000000,0.050000000000 1461568569,2977.050000000000,0.0

我有一个非常大的CSV文件,格式为第一列是一个
unix时间戳
,已经从最低到最高排序

1461568570,2977.320000000000,0.032000000000
1461568570,2977.320000000000,0.076000000000
1461568570,2977.320000000000,0.076000000000
1461568569,2977.050000000000,0.050000000000
1461568569,2977.050000000000,0.050000000000
1461568569,2977.300000000000,0.021900000000
1461568569,2977.310000000000,0.021900000000
1461568569,2977.320000000000,0.050000000000
1461568423,2978.510000000000,0.500000000000
1461568421,2977.920000000000,0.023300000000
1461568421,2977.920000000000,0.010900000000
1461568421,2977.910000000000,0.165800000000
我想将数据导入到pandas数据框中,但我想将其限制为数据的一个子集

现在,pandas
read_csv
skiprows
skipfooter
选项,我可以告诉他仅在csv文件中的某一点行之后检索数据。但我想指定要开始读取的行号,以便仅捕获某个
unix时间戳
之后的行(例如,基本上是以
unix时间戳
等于或高于
1461568423
开始的第一行的行号)


执行此操作的有效方法是什么?

我认为您可以对
get_row
使用预处理,它返回带有
时间戳的行数,并用于参数
skiprows


IIUC然后您可以执行以下操作:

In [47]:
line=0
chunksz=3
for chunk in pd.read_csv(io.StringIO(t), header=None, names = ['timestamp','val1','val2'], chunksize=chunksz):
    if len(chunk[chunk['timestamp'] == 1461568423]) > 0:
        line += chunk[chunk['timestamp'] == 1461568423].index[0]
        break
    else:
        line += chunksz
pd.read_csv(io.StringIO(t), header=None, names = ['timestamp','val1','val2'], skiprows=line)

Out[47]:
    timestamp     val1    val2
0  1461568423  2978.51  0.5000
1  1461568421  2977.92  0.0233
2  1461568421  2977.92  0.0109
3  1461568421  2977.91  0.1658

在这里,我们将一个行计数器设置为0和一个标称chunksz,我们对这些块进行迭代,直到找到匹配项,然后将其用作skiprows的参数值。这应该很快,因为我们可以设置一个大的chunksize,并在找不到行的地方不断跳过块。注意:在您提供的示例中,时间戳是从最高到最低排列的

考虑到您的csv文件如下:

timestamp
15
14
13
...
2
1
你可以分块阅读(
pd.read\u csv
有这样的选项):


您不必重复读取该文件。只需阅读合理大小的文章,并在到达时间戳后停止阅读。并从最后一个块中筛选过时的行。

它是固定宽度的文件吗?所有的线都一样长吗?如果是这样,那么你可以使用低级文件查找操作跳转到任何给定的行,那么这只是一个二进制搜索算法…@Spacedman不,不幸的是,行的长度不同。好吧,这是我认为的解决方案,大约是1,但是这样的话,我必须首先浏览所有的文件,这是我想以一种更有效的方式完成的部分。嗯,我认为不进行预处理是有问题的。我不确定我是否完全理解这个例子,但通过这种方式,我们仍然在读取所有文件,直到我们应该开始导入到Pandas中为止,对吗?我们在每次迭代中只读取一个块大小,一旦找到合适的行号,我们就从循环中中断并从该点读取文件,因为
read\u csv
很快,它应该很快找到所需的行
timestamp
15
14
13
...
2
1
import pandas as pd

LIMIT_TIMESTAMP = 5

df_reader = pd.read_csv('data.csv', iterator=True, chunksize=3)
df = pd.DataFrame()

for chunk in df_reader:
    if chunk['timestamp'].min() < LIMIT_TIMESTAMP:
        chunk = chunk[chunk['timestamp'] > LIMIT_TIMESTAMP]
        df = pd.concat([df, chunk])
        break

    df = pd.concat([df, chunk])

df = df.reset_index(drop=True)
   timestamp
0          15
1          14
2          13
3          12
4          11
5          10
6           9
7           8
8           7
9           6