Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dataframe-找到匹配项后停止搜索并导出数据_Python_Pandas_Dataframe - Fatal编程技术网

Python Dataframe-找到匹配项后停止搜索并导出数据

Python Dataframe-找到匹配项后停止搜索并导出数据,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个小程序可以搜索许多大文件(+500.000行/文件),并将结果导出到csv文件。我想知道在文件中找到特定日期后是否可以停止搜索。例如,在找到ini_日期(第2列)值(例如02/12/2020)后,程序应停止搜索并导出结果,包括第2列中包含“02/12/2020”的行以及与其他搜索条件匹配的行 目前我在文件夹中有73个datalog.log文件,这个数字正在不断增加。datalog0.log是较旧的文件,datalog72.log是最新的,过一段时间它将是datalog73.log(我想开

我有一个小程序可以搜索许多大文件(+500.000行/文件),并将结果导出到csv文件。我想知道在文件中找到特定日期后是否可以停止搜索。例如,在找到ini_日期(第2列)值(例如02/12/2020)后,程序应停止搜索并导出结果,包括第2列中包含“02/12/2020”的行以及与其他搜索条件匹配的行

目前我在文件夹中有73个datalog.log文件,这个数字正在不断增加。datalog0.log是较旧的文件,datalog72.log是最新的,过一段时间它将是datalog73.log(我想开始搜索最新的文件)。仅使用python就可以做到这一点吗?如果没有,我也将不得不为此使用SQL

在这里您可以看到我的代码:

import pandas as pd
from glob import glob

files = glob('C:/ProgramA/datalog*.log')
df = pd.concat([pd.read_csv(f, 
          low_memory=False
                  sep=',', 
                  names=["0","1","2","3","4","5","6","7"]) for f in files])


#Column 0: IP
#Column 1: User
#Column 2: Date
#Column 3: Hour

ip = input('Optional - Set IP: ')  #column 0
user = input('Optional - Set User: ')     #column 1
ini_date = input('Mandatory - From Day (Formant MM/DD/YYYY): ')   
fin_date = input('Mandatory - To Day (Formant MM/DD/YYYY): ')  
ini_hour = input('Mandatory - From Hour (Formant 00:00:00): ')  
fin_hour = input('Mandatory - To Hour (Formant 00:00:00): ')   

if ip == '' and user == '':
    df1 = df[(df["2"] >= ini_date) & (df["2"] <= fin_date) & (df["3"] >= ini_hour) & (df["3"] <= fin_hour)]
elif ip == '':
    df1 = df[(df["1"] == user) & (df["2"] >= ini_date) & (df["2"] <= fin_date) & (df["3"] >= ini_hour) & (df["3"] <= fin_hour)]
elif user == '':
    df1 = df[(df["0"] == ip) & (df["2"] >= ini_date) & (df["2"] <= fin_date) & (df["3"] >= ini_hour) & (df["3"] <= fin_hour)]
else:
    df1 = df[(df["0"] == ip) & (df["1"] == user) & (df["2"] >= ini_date) & (df["2"] <= fin_date) & (df["3"] >= ini_hour) & (df["3"] <= fin_hour)]

df1.to_csv ('C:/ProgramA/result.csv', index = False) 
因此,如果我按ini日期>=“09/27/2020”和fin日期
导入全局进行筛选
导入操作系统
作为pd进口熊猫
文件列表=glob.glob('/path/to/folder/*'))
#根据创建日期对文件进行排序
已排序的\u文件\u名称=已排序(文件列表,key=os.path.getctime,reverse=True)
找到的行数=False
final_df=pd.DataFrame()
对于已排序的文件名中的文件:
df=pd.read\u csv(文件)
#{执行所需的操作}
#获取所需的行
df1=df.loc[(df['2']=ini_日期)]
#如果当前文件中不存在所需行,但上一个文件中存在所需行,请断开
如果不是df1.empty:
行\u find=True
final_df=final_df.append(df1,忽略索引=False)
找到的行数为:
打破
最终文件至csv(“Name.csv”)

由@Shradha给出的答案应该会找到/获取您正在搜索的日期的所有条目,一旦您有了所有这些条目,您可以对这些条目子集单独应用其他过滤器,以节省计算和时间

我最初认为将日期设置为数据帧的索引将减少查找日志项的时间,但我错了。布尔掩码的工作速度比索引快

将熊猫作为pd导入
导入日期时间
将numpy作为np导入
导入时间
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
df=pd.read_csv('~/Documents/tmp.csv',name=[“版本”、“用户”、“日期”、“时间”、“数据1”、“数据2”])
df.set_索引('date',inplace=True)
df.index=pd.to_datetime(df.index,dayfirst=True)
打印df.loc[日期时间日期(2020年9月27日)]
印刷品
日期索引=pd.日期范围(开始时间=1/1/1850',期间=100000)#100000个条目
一些数据=pd.系列(np.random.randint(1100,size=date\u index.shape))
df=pd.DataFrame(data={'some_data':some_data})
df.index=日期索引
df=df.append([df,df,df,df])
打印“df的形状为:”,df.shape
开始=时间。时间()
打印df.loc[日期时间日期(2020年3月14日)]
end=time.time()
打印“所用时间为:”,结束-开始
印刷品
df.reset_索引(原地=真)
df.columns=['my_index','some_data']
开始=时间。时间()
打印df.loc[df['my_index']==datetime.date(2020,3,14)]
end=time.time()
打印“所用时间为:”,结束-开始
印刷品
输出
如果您还可以发布一个日志条目的外观示例,这将有助于回答这个问题。因为您的日志似乎是连续的,所以我认为这在python中应该是可能的。是的,日志是连续的。编辑主帖子以添加示例。谢谢,谢谢你的回答。问题是,我有很多行将与ini_日期值匹配,我还需要获取与此匹配的所有行,而不仅仅是第一行。
df.loc[df['2']==ini_日期]
将从数据框中获取与
ini_日期
匹配的所有行。好的,谢谢您的回答。我已经对它进行了测试,它可以正常工作,但是,如何确保程序开始搜索文件夹的最后一个文件?我的意思是,开始在datalog72.log(上次创建的文件)而不是datalog0.log中搜索?谢谢,请看上面的更新。我还没有测试过,如果不起作用请告诉我。非常感谢你,我使用了这个代码进行了一些修改,它对我所需要的非常有用:-)。谢谢你的回答。是的,我的主要目标是尽量减少计算时间。问题是,我需要一种方法来告诉我的程序,它开始在最后创建的文件中搜索,并开始在最后一个文件的行中搜索。为什么?因为如果两个文件中的日期相同,则中断将停止循环,我将丢失上一个文件中的数据。@Debon54您可以根据文件创建的时间对文件进行预排序,方法是:按照文件中的答案进行排序,然后根据您的意想对其进行处理。t非常感谢。您知道如何从csv文件的最后一行开始迭代吗?谢谢不客气,若要反向迭代,可以使用负索引。
File0:
        1.1.1.1      user       09/24/2020       09:18:00    Other data...................
        1.1.1.1      user       09/24/2020       10:00:00    Other data...................
        1.1.1.1      user       09/25/2020       07:30:00    Other data...................
        1.1.1.1      user       09/25/2020       09:30:00    Other data...................

File1:
        1.1.1.1      user       09/26/2020       04:18:00    Other data...................
        1.1.1.1      user       09/26/2020       10:00:00    Other data...................
        1.1.1.1      user       09/26/2020       11:18:00    Other data...................
        1.1.1.1      user       09/26/2020       12:00:00    Other data...................

File2:
        1.1.1.1      user       09/26/2020       14:18:00    Other data...................
        1.1.1.1      user       09/27/2020       16:00:00    Other data...................
        1.1.1.1      user       09/28/2020       10:18:00    Other data...................
        1.1.1.1      user       09/29/2020       12:00:00    Other data...................
        1.1.1.1      user       09/27/2020       16:00:00    Other data...................
        1.1.1.1      user       09/28/2020       10:18:00    Other data...................
import glob
import os
import pandas as pd

list_of_files = glob.glob('/path/to/folder/*')

# Sorts files based on creation date
sorted_file_names = sorted(list_of_files, key=os.path.getctime, reverse = True)

rows_found = False
final_df = pd.DataFrame()
for file in sorted_file_names:
    df = pd.read_csv(file)

    # {Perform required operations}

    # Fetches required rows
    df1 = df.loc[(df['2'] <= fin_date) & (df['2'] >= ini_date)]
 
    # If required rows don't exist in current file but existed in previous file, break
    if not df1.empty:
        rows_found = True
        final_df = final_df.append(df1, ignore_index=False)
    elif rows_found:
        break

final_df.to_csv("Name.csv")
version     1.1.1.1
user           user
time       16:00:00
data1         Other
data2          data
Name: 2020-09-27 00:00:00, dtype: object
############################
shape of df is:  (500000, 1)
version     1.1.1.1
user           user
time       16:00:00
data1         Other
data2          data
Name: 2020-09-27 00:00:00, dtype: object
############################
shape of df is:  (500000, 1)
############################
Through direct indexing
            some_data
2020-03-14         93
2020-03-14         93
2020-03-14         93
2020-03-14         93
2020-03-14         93
time taken is:  0.0407321453094
############################
Using boolean mask
         my_index  some_data
62164  2020-03-14         93
162164 2020-03-14         93
262164 2020-03-14         93
362164 2020-03-14         93
462164 2020-03-14         93
time taken is:  0.00653505325317
############################