我有一个包含 100002 行的大型 .out 文件。我正在 VSCode 1.88.0 中工作并安装了 Python 3.12.2。我只读取文件中的两列数据:“Time”和“Sum(cvBot)”,但是当我使用 pandas 读取数据文件时,数据查看器中的许多条目都是 NaN,而它们不在我的原始文件中。 (例如,NaN 一直持续到第 10000 行,当我指定索引列时,类似的问题仍然存在)。在 VSCode 中查看的数据示例如下:
Time cvTop cvBot Sum(cvTop) Sum(cvBot) cvCh0 cvCh1 cTop cRoot cBot cvRoot Sum(cvRoot) Sum(cvNEql) TLevel cGWL cRunOff Sum(cRunOff) (cv(i), Sum(cv(i)), i=1,NObs)
[T] [M/L2/T] [M/L2/T] [M/L2] [M/L2] [M/L2] [M/L2] [M/L3] [M/L3] [M/L3] [M/L2/T] [M/L2] [M/L2] [M/L3] [M/L2] [M/L3] [M/L2/T] [M/L2]
0.0010 0.00000E+00 -0.15405E-02 0.00000E+00 -0.15405E-05 0.00000E+00 0.00000E+00 0.29945E+03 0.00000E+00 0.15410E+04 0.00000E+00 0.00000E+00 0.00000E+00 1 0.00000E+00 0.00000E+00 0.00000E+00 0.29385E+03 0.29385E+00 -0.54338E+04 -0.54338E+01 -0.16439E+05 -0.16439E+02 -0.64983E+04 -0.64983E+01
0.0020 0.00000E+00 0.43077E-02 0.00000E+00 0.27673E-05 0.00000E+00 0.00000E+00 0.30023E+03 0.00000E+00 0.15410E+04 0.00000E+00 0.00000E+00 0.00000E+00 2 0.00000E+00 0.00000E+00 0.00000E+00 0.29437E+03 0.58822E+00 -0.43086E+04 -0.97424E+01 -0.93670E+04 -0.25806E+02 -0.70594E+04 -0.13558E+02
0.0030 0.00000E+00 0.43077E-02 0.00000E+00 0.70750E-05 0.00000E+00 0.00000E+00 0.30070E+03 0.00000E+00 0.15410E+04 0.00000E+00 0.00000E+00 0.00000E+00 3 0.00000E+00 0.00000E+00 0.00000E+00 0.29460E+03 0.88282E+00 -0.37590E+04 -0.13501E+02 -0.70042E+04 -0.32811E+02 -0.68129E+04 -0.20371E+02
.
.
.
2.8186 0.00000E+00 -0.71450E-02 0.00000E+00 0.43578E-03 0.00000E+00 0.00000E+00 0.21151E+07 0.00000E+00 0.15397E+04 0.00000E+00 0.00000E+00 0.00000E+00 998 0.00000E+00 0.00000E+00 0.00000E+00 0.18807E+07 0.41397E+06 -0.24422E+04 -0.70533E+03 0.91943E+02 -0.62800E+02 0.25422E+02 -0.37256E+03
2.8193 0.00000E+00 -0.71450E-02 0.00000E+00 0.43083E-03 0.00000E+00 0.00000E+00 0.21229E+07 0.00000E+00 0.15397E+04 0.00000E+00 0.00000E+00 0.00000E+00 999 0.00000E+00 0.00000E+00 0.00000E+00 0.18877E+07 0.41528E+06 -0.24486E+04 -0.70702E+03 0.91960E+02 -0.62737E+02 0.25429E+02 -0.37255E+03
2.8200 0.00000E+00 -0.71450E-02 0.00000E+00 0.42588E-03 0.00000E+00 0.00000E+00 0.21307E+07 0.00000E+00 0.15397E+04 0.00000E+00 0.00000E+00 0.00000E+00 1000 0.00000E+00 0.00000E+00 0.00000E+00 0.18946E+07 0.41660E+06 -0.24551E+04 -0.70872E+03 0.91977E+02 -0.62673E+02 0.25435E+02 -0.37253E+03
如果有人感兴趣,这里是数据文件的链接:Data
我的 VSCode 数据查看器的图像在这里,因为我无法复制粘贴输出。
我的目的是读取两列数据,以便我可以绘制时间序列。当前读取和绘制数据的代码是:
import matplotlib.pyplot as plt
import pandas as pd
# Load time series data from a file
file_path = r'C:\Program Files\Hydrus-1D\Examples\Direct\Attempt10\solute1_Copy.out'
data = pd.read_csv(file_path, usecols=["Time", "Sum(cvBot)"], index_col=False, skiprows=[1], sep = " ")
我还使用其中一列(“TLevel”)作为索引列,但数据行在第 15370 行之前记录为 NaN。
我浏览过讨论类似问题的页面,例如Pandas read_csv 未读取文件中的所有行,但我无法让它工作。我不确定问题是什么,但有额外的数据列,在我的数据集中最右边的列可能有也可能没有标签,这可能是一个原因。有没有办法让 pandas 正确读取我的数据文件?
您的文件需要先整理好,然后 pandas 才能正确读取它。有很多随机且不一致的空白使用,因此只需清理即可。以下代码删除所有前导和尾随空格,并将列之间不一致的空格转换为单个空格:
import matplotlib.pyplot as plt
import pandas as pd
import re
import io
# Load time series data from a file
file_path = r'C:\Program Files\Hydrus-1D\Examples\Direct\Attempt10\solute1_Copy.out'
with open(file_path) as f:
lines = f.readlines()
lines = [line.strip() for line in lines]
file_contents = '\n'.join(lines)
file_contents = re.sub(' +', ' ', file_contents)
data = pd.read_csv(io.StringIO(file_contents), usecols=["Time", "Sum(cvBot)"], index_col=False, skiprows=[1], sep = " ")
如果想更简洁,清洁步骤可以简化为两行:
with open(file_path) as f:
file_contents = re.sub(' +', ' ', '\n'.join([line.strip() for line in f.readlines()]))
注意
io.StringIO()
调用,因为这会将字符串转换为 pandas 用来读取的类似文件的对象。
这应该允许 pandas 正确读取数据,但请注意,您可能需要根据您的用例指定预期数据的类型。