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

标签 python csv datetime pandas

我有一个 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)

导致索引错误

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

非常感谢任何指导。

最佳答案

如果您传递参数 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']])

应该可以工作,然后覆盖列名称

关于python - Pandas 读取带有多个空格的 csv 并解析日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36876798/

相关文章:

python - 如何在 Flask 应用程序中测试登录(使用 MySQL)?

javascript - 如何为多种语言定义新的日期字符串并在 Moment.js 中使用它?

python-3.x - 在 pandas 中分割日期时间

python - Django 内部服务器错误而不是 404

java - 如何定义嵌套类常量?

python - 在 Django 中发布数据值错误

python - 将 CSV 上传到 Flask 进行后台处理

java - 自定义 CSVFormat.RFC4180

java - 如何使用 ICsvBeanWriter 在 java 中更改 csv 的标题颜色

Python 日期实用程序库