【问题标题】:python read_csv pandas parse column with format like 1990M01 to a montly date formatpython read_csv pandas 将格式为 1990M01 的列解析为每月日期格式
【发布时间】:2019-12-23 13:06:07
【问题描述】:

我有一个这样的 CSV 文件

obs , yr30 , tbill3m , ret3m
1990M01 , 7.98 , 7.8 , 0.028205
1990M02 , 8.44 , 8.02 , 0.007481
1990M03 , 8.61 , 8.08 , -0.003713

我尝试这样导入

data = read_csv('/mypath/mydata.csv', 
                  header=0,
                  index_col=0, 
                  parse_dates=['obs'])

但是python并不理解它应该是yyyy-mm格式,因为索引仍然使用1990M01之类的格式

我正在寻找解决该问题的最佳实践。

【问题讨论】:

    标签: pandas date parsing


    【解决方案1】:

    用途:

    import pandas as pd
    from io import StringIO
    
    temp=u"""obs,yr30,tbill3m,ret3m
    1990M01,7.98,7.8,0.028205
    1990M02,8.44,8.02,0.007481
    1990M03,8.61,8.08,-0.003713"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(StringIO(temp),  
                     index_col=0)
    
    print (df)
             yr30  tbill3m     ret3m
    obs                             
    1990M01  7.98     7.80  0.028205
    1990M02  8.44     8.02  0.007481
    1990M03  8.61     8.08 -0.003713
    

    然后通过to_datetime将索引转换为日期时间:

    df.index = pd.to_datetime(df.index, format='%YM%m')
    print (df)
                yr30  tbill3m     ret3m
    obs                                
    1990-01-01  7.98     7.80  0.028205
    1990-02-01  8.44     8.02  0.007481
    1990-03-01  8.61     8.08 -0.003713
    

    然后到Series.dt.to_period的月份:

    df.index = pd.to_datetime(df.index, format='%YM%m').to_period('m')
    print (df)
             yr30  tbill3m     ret3m
    obs                             
    1990-01  7.98     7.80  0.028205
    1990-02  8.44     8.02  0.007481
    1990-03  8.61     8.08 -0.003713
    

    【讨论】:

    • 非常感谢喜欢 df.index = pd.to_datetime(df.index, format='%YM%m') 解决方案。
    【解决方案2】:

    有一个date_parser 选项可容纳非标准日期格式。

    使用 jezrael 的数据,

    df = pd.read_csv(StringIO(temp),
                     index_col=0, 
                     parse_dates=True, 
                     date_parser=lambda x:pd.datetime.strptime(x,'%YM%m'))
    

    【讨论】:

    • 谢谢,听起来也很棒。那么 to_datetime 和 date_parser 是否相等或出于某种原因有一种更好的方法?
    • date_parser 在读取文件时解析日期。 pd.to_datetime 读取文件后将字符串转换为日期时间。
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2015-04-29
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多