6

次の形式の 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ライブラリを使用してそれらを読み取ろうとしています (これまでのところ素晴らしいライブラリのようです)。

パンダには 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」属性を指定できることがわかります。しかし、ドキュメントにはその方法が示されておらず、私はそれを理解することができません。手を差し伸べることができる主題の経験を持つ人。

乾杯、 ブルーノ

4

2 に答える 2

11

複数列の日付を解析するには、どの列を単一の日付に結合する必要があるかをパンダに伝える必要があるため、次のように言う必要があります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
于 2012-09-05T02:14:39.627 に答える
0

使用する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')
于 2021-08-21T04:26:55.183 に答える