Python按加载日期进行筛选
我读过一些关于使用skiprows和chunk size等思想以增量方式加载CSV的帖子,但没有任何东西适合我的特定用例。理想情况下,我想要一个像下推谓词一样工作的东西 我有一个很大的csv(860万行),只想加载过去一周的数据。文件中有一个指定日期的字段,我当前正在加载整个df,然后按日期过滤。我不确定是否可以完全跳过加载旧记录,但这将是我的目标。这可行吗 编辑:以下是我使用的代码:Python按加载日期进行筛选,python,pandas,Python,Pandas,我读过一些关于使用skiprows和chunk size等思想以增量方式加载CSV的帖子,但没有任何东西适合我的特定用例。理想情况下,我想要一个像下推谓词一样工作的东西 我有一个很大的csv(860万行),只想加载过去一周的数据。文件中有一个指定日期的字段,我当前正在加载整个df,然后按日期过滤。我不确定是否可以完全跳过加载旧记录,但这将是我的目标。这可行吗 编辑:以下是我使用的代码: import boto3 S3Client = boto3.client('s3','us-east-1')
import boto3
S3Client = boto3.client('s3','us-east-1')
obj = S3Client.get_object(Bucket = 'bucket_name', Key = 'some_key')
df = pd.read_csv(io.BytesIO(obj['Body'].read()))
并且数据的格式如下所示:
|'Cust_ID'|'Type'|'Date_of_activity'|'Amount'|'Item_count'|'time_of_order'|
---------------------------------------------------------------------------
|1234 |OL |12-12-2019 |1234 |10 |23:34 |
|5678 |IS |12-12-2019 |8765 |50 |11:34 |
|9101 |OL |12-13-2019 |1504 |17 |3:45 |
我为两个独立的CSV做这个,每个CSV都有大约800-1000万条记录
在加载数据帧后,我正在进行一些连接、过滤和聚合,这在pandas中比仅使用标准CSV模块要容易得多。我认为chunk\u size
不起作用,因为从我所读到的内容来看,它实际上不允许我根据'Date\u of\u activity'
进行过滤,它一次只加载一定数量的行
基本上,我们每周都会收到一份完整的历史数据转储,而实际上我们需要的只是前一周的订单 你可以用一个
它将只计算您明确告诉它的内容,而不需要将整个数据帧加载到内存。加载所有数据然后过滤到Pandas中有什么不对?加载数据帧大约需要6分钟,因为它有大约1000万条记录,而我只需要大约120k条记录。只是想减少时间/成本文件/数据作为一个整体有多大?在做了一些思考和研究之后,我有几个问题要问你:你做过任何基准测试或分析吗?您写道,创建具有
块大小的迭代器不适合您的用例,为什么?我认为它非常适合解决这个问题。是否指定了所有列数据类型?你在做什么来解析日期本身?您是否尝试过内存映射
选项?您是否考虑过使用basiccsv
模块而不是Pandas,因为您不需要后者的强大功能?我在前面写过,如果您能分享更多关于数据的信息,那就太好了。我要补充的是,拥有你的代码,甚至是其中的一部分,会有很大的帮助。总而言之,这是一个很好的问题,我希望它能有所帮助。关于这一主题的类似问题似乎大多有陈旧过时的答案。我希望能够尝试一系列不同的东西,并得出一个对很多人都有用的大而可靠的答案。你的意思是不需要将数据帧加载到内存中,对吗?这可能行得通。我正在尝试优化lambda函数,但我不确定dask在lambda中是否可行。我可以看看其他的AWSservices@DBA108642它应该适用于这个应用程序,特别是因为您是按日期分区的。加载dask数据帧,并像平常一样运行操作。如果date是您的索引,它可能会运行得更快。请参阅文档:@bwc数据以平面csv形式接收,因此它没有任何分区。@DBA108642说到这里,您可以共享部分数据吗?或者至少是一些有代表性的东西,这样我们才能更好地了解情况。