首页 > 解决方案 > 如何使pandas read_csv中的分隔符接受定义的空格范围作为分隔符

问题描述

这个问题类似于How to make separator in pandas read_csv more flexible wrt whitespace, for 不规则分隔符?

我有一个这种格式的文本文件

year    jan    feb    mar    apr    may    jun    jul    aug    sep    oct    nov    dec     win     spr     sum     aut     ann
2017    0.2    3.6    5.0    4.2    8.8   12.2   12.9   11.7    9.7    9.2    3.5    1.8    2.01    6.01   12.27    7.48    6.92
2018    2.4   -0.5    1.9    6.6    7.9   10.8   13.5   12.8    9.6    7.2    5.2    3.8    1.32    5.43   12.36    7.33    6.80
2019    0.9    1.8    4.4    3.6    6.5   10.8   13.3   12.6   10.0    7.2    3.6    2.9    2.22    4.85   12.25    6.90    6.49
2020    3.8    3.3    2.8    4.8    6.9                                                     3.31    4.81                        

文本文件的列 [3-4] 之间的空格数不规则,我不需要列 ['win','spr','sum','aut','ann']

首先,为了处理不规则的空间,我使用了这个:

    parse_column = ['year']
    weather_data = pd.read_csv(StringIO(postString),delimiter=r'\s+',parse_dates=parse_column, engine='python')

但是,这会将“win”和“spr”的值折叠为“jun”和“jul”

接下来我尝试了

    parse_column = ['year']
    weather_data = pd.read_csv(StringIO(postString),delimiter=r'\s[0-4]',parse_dates=parse_column, engine='python')

但这导致

ValueError: 'year' is not in list

最后,我尝试在导入过程中删除不必要的列,如下所示:

parse_column = ['year']
weather_data = pd.read_csv(StringIO(postString),delimiter=r'\s+',parse_dates=parse_column, engine='python',usecols=['year','jan','feb','mar','apr','may','jun','jul','aug','sep','oct', 'nov','dec'])

然而,这会产生与第一次尝试相同的结果。

我希望我缺少一个相对简单的正则表达式,但是r'\s[01-5]'排除“年份”列或返回错误消息的变体,例如x columns expected, y found

我试图避免在加载后删除这些错误解析的值,因为随着我们一年的推移,错误数据的变化如此之多。

标签: pythonpandascsv

解决方案


推荐阅读