【问题标题】:Using python pandas to parse CSV with date in format Year, Day, Hour, Min, Sec使用 python pandas 解析日期格式为年、日、小时、分钟、秒的 CSV
【发布时间】:2012-08-29 11:16:41
【问题描述】:

我有几个 CSV 文件,格式如下:

Year,Day,Hour,Min,Sec.,P1'S1
 2003,  1, 0, 0,12.22, 0.541
 2003,  1, 1, 0,20.69, 0.708
 2003,  1, 2, 0, 4.95, 0.520
 2003,  1, 3, 0,13.42, 0.539
...

(其中 day,是 一年中的哪一天),我正在尝试使用 pandas 库来阅读它们(似乎是到目前为止很棒的库)。

有一个内置函数可以读取 pandas 中的 CSV,甚至更好的是,该函数可以检查列中的日期类型。并自动将其用作索引(这对于我正在做的事情来说非常完美)。

问题是,我无法让它处理这种格式的日期数据。

我试过了:

data = pd.read_csv("csvFile.csv", index_col=[0, 1],  , index_col=[0, 1, 2, 3, 4] parse_dates=True)

只能正确获取年份

In [36]: data.index
Out[36]: 
MultiIndex
[(<Timestamp: 2003-09-04 00:00:00>, 1, 0, 0, 12.22)
 (<Timestamp: 2003-09-04 00:00:00>, 1, 1, 0, 20.69)
 (<Timestamp: 2003-09-04 00:00:00>, 1, 2, 0, 4.95) ...,
 (<Timestamp: 2003-09-04 00:00:00>, 365, 21, 0, 3.77)
 (<Timestamp: 2003-09-04 00:00:00>, 365, 22, 0, 14.6)
 (<Timestamp: 2003-09-04 00:00:00>, 365, 23, 0, 13.36)]

从文档中,我看到您可以在 pandas 的 read_csv 函数中指定 "date_parser" 属性。但是文档没有显示如何并且我无法弄清楚。 任何有这方面经验的人都可以提供帮助。

干杯, 布鲁诺

【问题讨论】:

    标签: python pandas python-dateutil


    【解决方案1】:

    为了解析多列日期,需要告诉pandas哪些列应该合并成一个日期,所以需要说parse_dates=['Year','Day','Hour','Min','Sec']

    您还需要定义自己的解析器,该解析器从您在parse_dates 中指定的每一列中获取一个元素:

    In [1]: import pandas as pd
    
    In [2]: from datetime import datetime, timedelta
    
    In [3]: from cStringIO import StringIO
    
    In [4]: data = """\
    Year,Day,Hour,Min,Sec.,P1'S1
     2003,  1, 0, 0,12.22, 0.541
     2003,  1, 1, 0,20.69, 0.708
     2003,  1, 2, 0, 4.95, 0.520
     2003,  1, 3, 0,13.42, 0.539
    """
    
    In [5]: def parse(yr, doy, hr, min, sec):
        yr, doy, hr, min = [int(x) for x in [yr, doy, hr, min]]
        sec = float(sec)
        mu_sec = int((sec - int(sec)) * 1e6)
        sec = int(sec)
        dt = datetime(yr - 1, 12, 31)
        delta = timedelta(days=doy, hours=hr, minutes=min, seconds=sec,
                          microseconds=mu_sec)
        return dt + delta
       ...: 
    
    In [6]: pd.read_csv(StringIO(data), parse_dates={'datetime':      
               ['Year','Day','Hour','Min','Sec.']}, 
               date_parser=parse, index_col='datetime')
    Out[6]: 
                                P1'S1
    datetime                         
    2003-01-01 00:00:12.220000  0.541
    2003-01-01 01:00:20.690000  0.708
    2003-01-01 02:00:04.950000  0.520
    2003-01-01 03:00:13.419999  0.539
    

    【讨论】:

    • 我检查了,问题是文件在“Year”标题之前有一个空格(就像它下面的年份值一样)。如果我在“年份”之前在 read_csv 中放置一个空格以成为“年份”,它会完美运行。非常挑剔,但有效。谢谢!
    【解决方案2】:

    使用pandas.to_datetime()

    import pandas as pd
    
    def parser(year, yday, h, m, s):
        return pd.to_datetime(year + '-' + yday + ' ' + h + ':' + m + ':' + s,
                              format='%Y-%j %H:%M:%S')
    
    df = pd.read_csv('input.csv',
             parse_dates={'datetime': ['Year','Day','Hour','Min','Sec.']}, 
             date_parser=parser,
             index_col='datetime')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2023-03-13
      • 2017-11-22
      • 2015-02-24
      • 2011-07-26
      • 2021-12-27
      相关资源
      最近更新 更多