【问题标题】:Parse dates and create time series from .csv解析日期并从 .csv 创建时间序列
【发布时间】:2017-02-22 11:09:27
【问题描述】:

我正在使用一个简单的 csv 文件,其中包含有关卡路里摄入的数据。它有 4 列:caldaymonth、年份。它看起来像这样:

cal        month  year  day
3668.4333      1  2002   10
3652.2498      1  2002   11
3647.8662      1  2002   12
3646.6843      1  2002   13
...
3661.9414      2  2003   14

# data types
cal      float64
month      int64
year       int64
day        int64

我正在尝试做一些简单的时间序列分析。因此,我想将monthyearday 解析为单个列。我使用pandas 尝试了以下操作:

import pandas as pd
from pandas import Series, DataFrame, Panel

data = pd.read_csv('time_series_calories.csv', header=0, pars_dates=['day', 'month', 'year']], date_parser=True, infer_datetime_format=True)

我的问题是:(1)如何解析数据和(2)定义新列的数据类型?我知道还有很多其他类似的问题和答案(例如,请参阅hereherehere)——但到目前为止我还不能让它发挥作用。

【问题讨论】:

    标签: python-3.x csv parsing pandas time-series


    【解决方案1】:

    您可以使用参数parse_dateslist 中定义列名read_csv

    import pandas as pd
    import numpy as np
    import io
    
    temp=u"""cal,month,year,day
    3668.4333,1,2002,10
    3652.2498,1,2002,11
    3647.8662,1,2002,12
    3646.6843,1,2002,13
    3661.9414,2,2003,14"""
    #after testing replace io.StringIO(temp) to filename
    df = pd.read_csv(io.StringIO(temp), parse_dates=[['year','month','day']])
    
    print (df)
      year_month_day        cal
    0     2002-01-10  3668.4333
    1     2002-01-11  3652.2498
    2     2002-01-12  3647.8662
    3     2002-01-13  3646.6843
    4     2003-02-14  3661.9414
    
    print (df.dtypes)
    year_month_day    datetime64[ns]
    cal                      float64
    dtype: object
    

    然后你可以重命名列:

    df.rename(columns={'year_month_day':'date'}, inplace=True)
    print (df)
            date        cal
    0 2002-01-10  3668.4333
    1 2002-01-11  3652.2498
    2 2002-01-12  3647.8662
    3 2002-01-13  3646.6843
    4 2003-02-14  3661.9414
    

    或者更好的方法是将带有新列名的dictionary 传递给parse_dates

    df = pd.read_csv(io.StringIO(temp), parse_dates={'dates': ['year','month','day']})
    
    print (df)
           dates        cal
    0 2002-01-10  3668.4333
    1 2002-01-11  3652.2498
    2 2002-01-12  3647.8662
    3 2002-01-13  3646.6843
    4 2003-02-14  3661.9414
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-01
      • 2018-02-18
      • 2021-06-20
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      • 2019-01-24
      相关资源
      最近更新 更多