我有一个很大的合约CSV数据库(2500万行,大约7 GB)。我需要过滤掉过期的合约,以减少进一步计算的大小。过期日期数组包含混合格式的日期(dd/mm/yyyy和dd/mm/yyyy hh/mm/ss)。
我试着用这个代码:
#reading database
reader = pd.read_csv(path_contracts, sep="|", header=0, low_memory=False, chunksize=1000000)
output = "Base_Filtered.csv"
#filtering chunks
for contracts in reader:
contracts[name_date_end] = pd.to_datetime(contracts[name_date_end], dayfirst=True, format='mixed')
#conditional
contracts = contracts[(contracts[name_date_end]>=date_report)]
#outputing filtered chunks
contracts.to_csv(output, sep="|")
字符串
但我得到了这个错误:
pandas._libs.tslibs.np_datetime.OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 31.08.8020, at position 3584
型
我检查了位置3584,它返回06.11.2021:
print(contracts.at[3584,name_date_end])
06.11.2021
型
因此,我尝试制作一个较小版本的数据库(5 k行),其中包含此元素,并且它工作得非常好。
在尝试过滤数据块之前,我尝试过一次过滤整个数据库。它产生了相同的错误,但在不同的位置。
无法找出问题的根源和解决方案。
1条答案
按热度按时间pvabu6sv1#
在我看来,你只需要两种日期或日期时间格式,而你的数据不止这些,但你不知道它们可能是什么。
对于如此大的数据集,很难事先询问它并使一切完美,所以也许你需要迭代和交互地运行这个过程:
我模拟了一个非常简单的输入CSV:
字符串
以下脚本:
型
这将生成以下CSV:
型
并将以下内容打印到stdout:
型
然后,我会取
3.3.2003
和7.1.2001-5:38:19
,用r"%d.%m.%Y
和r"%d.%m.%Y-%H:%M:%S"
更新fmt:型
以及:
bads CSV为空,过滤后的CSV如下所示:
型