繁体   English   中英

Pandas 读取带有多个空格的 csv 并解析日期

[英]Pandas read csv with multiple whitespaces and parse dates

我有一个 csv 文件,看起来像

Year Mo Da (01,52) 
1950  1    1    0.00    
1950  1    2    0.00    
1950  1    3    0.05    
1950  1    4    0.00    
1950  1    5    0.07    
1950  1    6    0.07

我想将其转换为具有 2 列的数据框:YYYYMMDD 的日期时间列(使用原始数据中的“Year”、“Mo”和“Da”列),然后是网格点处的降雨量(例如 01 , 52) 作为第二列。

所需的输出是:

Datetime Rainfall
19500101 0.00
19500102 0.00
19500103 0.05

我被困在两个问题上:在读入期间适当地考虑空格并正确使用parse_dates

简单的读入命令:

df = pd.read_csv(csv_fl)

几乎正确读取标题,但将 (01,52) 拆分为单独的列,产生不应该存在的尾随 NaN。

     Year Mo Da (01  52)
0  1950  1    1    0.00  NaN

并尝试使用解析日期

df = pd.read_csv(csv_fl, parse_dates={'Datetime':[0,1,2]}, index_col=0)

导致 IndexError

    colnames.append(str(columns[c]))
 IndexError: list index out of range

非常感谢任何指导。

如果您传递 params delim_whitespace=True并将列表中的 3 parse_dates那么最后一步就是覆盖列名:

In [96]:
import pandas as pd
import io
t="""Year Mo Da (01,52) 
1950  1    1    0.00    
1950  1    2    0.00    
1950  1    3    0.05    
1950  1    4    0.00    
1950  1    5    0.07    
1950  1    6    0.07"""
df =pd.read_csv(io.StringIO(t), delim_whitespace=True, parse_dates=[['Year','Mo','Da']])
df.columns = ['Datetime', 'Rainfall']
df

Out[96]:
    Datetime  Rainfall
0 1950-01-01      0.00
1 1950-01-02      0.00
2 1950-01-03      0.05
3 1950-01-04      0.00
4 1950-01-05      0.07
5 1950-01-06      0.07

所以我期望: df = pd.read_csv(csv_fl, delim_whitespace=True, parse_dates=[['Year','Mo','Da']])

应该工作,然后覆盖列名

filename = "..."
>>> pd.read_csv(filename, 
                sep=" ", 
                skipinitialspace=True, 
                parse_dates={'Datetime': [0, 1, 2]}, 
                usecols=[0, 1, 2, 3], 
                names=["Y", "M", "D", "Rainfall"], 
                skiprows=1)
    Datetime  Rainfall
0 1950-01-01      0.00
1 1950-01-02      0.00
2 1950-01-03      0.05
3 1950-01-04      0.00
4 1950-01-05      0.07
5 1950-01-06      0.07

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM