1

私はこの形式で csv を読み込もうとしています:

2014,92,1931,6.234,10.14
2014,92,1932,5.823,9.49
2014,92,1933,5.33,7.65
2014,92,1934,4.751,6.19
2014,92,1935,4.156,5.285
2014,92,1936,3.962,4.652
2014,92,1937,3.74,4.314
2014,92,1938,3.325,3.98
2014,92,1939,2.909,3.847
2014,92,1940,2.878,3.164

明確にするために、これは (年、年間通算日、24:00 時間、および 2 列の値) です。

以前の質問でこの問題についていくつか考えましたが、役に立たず、いくつかの問題があることが証明されています... ( pandas を使用して 3 列の日付/時刻情報からインデックス付きの datetime を作成します)

上記の質問で述べたように、次の「read_csv」試行

df = pd.read_csv("home_prepped.dat", parse_dates={"dt" : [0,1,2]}, 
                  date_parser=parser, header=None)

TypeError をトリガーします。

TypeError: parser() takes exactly 1 argument (3 given) 

これは、「parse_dates」引数に 0,1,2 が含まれているためです。また、それらを二重括弧 [[0,1,2]] に入れてみましたが、次のようになりました。

ValueError: [0, 1, 2] is not in list

parse_dates=True を設定することでこれを乗り越えましたが、後で set_index を設定できると思っていましたが、次のようになりました。

TypeError: numpy.int64 ではなく、文字列でなければなりません

私のパーサーもフォーマットに引っかかってしまい、「年間通算日」の値をゼロで埋めるという相反する話を読んだことがあります。私のものはゼロで埋められていませんが、それでも、上記のエラーはさておき、最初の値である年でフォーマットがハングアップしました! パーサーは次のとおりです。

def parser(x):
    return pd.datetime.strptime(x, '%Y %j %H%M')

そうです、「2014」が認識されず、「92」(年の日)が認識されないというエラーが発生しましたが、少なくとも strptime がフォーマットを試すために「通り抜ける」ことができたので、奨励されました。

これが私のデータと関係があるかどうか疑問に思っています。

この日時情報を日時としてインデックス化する方法を探していますが、問題はありませんでした。パディングの問題であるフォーマットを誰かがテストしたい場合に備えて、いくつかのジュリアンをパディングしました。以下を参照してください。

2014,092,1931,6.234,10.14
2014,092,1932,5.823,9.49
2014,092,1933,5.33,7.65
2014,092,1934,4.751,6.19
2014,092,1935,4.156,5.285
2014,092,1936,3.962,4.652
2014,092,1937,3.74,4.314
2014,092,1938,3.325,3.98
2014,092,1939,2.909,3.847
2014,092,1940,2.878,3.164

助けてくれてありがとう、私はここで本当にイライラし始めています:S

4

2 に答える 2

1

%m(月) を(分) に修正する%Mと、コードが機能します。

>>> import pandas as pd
>>> print pd.version.version
0.15.2-10-gf7af818
>>> 
>>> def parser(x):
...         return pd.datetime.strptime(x, '%Y %j %H%M')
... 
>>> df = pd.read_csv("home_prepped.dat", parse_dates={"dt" : [0,1,2]}, 
...                  date_parser=parser, header=None)
>>> df
                   dt      3       4
0 2014-04-02 19:31:00  6.234  10.140
1 2014-04-02 19:32:00  5.823   9.490
2 2014-04-02 19:33:00  5.330   7.650
3 2014-04-02 19:34:00  4.751   6.190
4 2014-04-02 19:35:00  4.156   5.285
5 2014-04-02 19:36:00  3.962   4.652
6 2014-04-02 19:37:00  3.740   4.314
7 2014-04-02 19:38:00  3.325   3.980
8 2014-04-02 19:39:00  2.909   3.847
9 2014-04-02 19:40:00  2.878   3.164

しかし、これをしばらくいじってみると、エラーが発生したときに非常に奇妙な動作がいくつかあり、奇妙なエラー メッセージが表示されるので、これをデバッグするのが非常に難しい理由がわかりました。


何らかの理由で上記が機能しない場合は、自分で解析を試すことができます。

df = pd.read_csv("home_prepped.dat", header=None)
timestr = df.iloc[:,:3].astype(str).apply(' '.join,axis=1)
df = df.iloc[:,3:]
times = pd.to_datetime(timestr, format='%Y %j %H%M')
df["dt"] = times

前述のように、何か問題が発生した場合 (解析エラーなど)、エラー メッセージは 内から非常に混乱しますread_csv

于 2014-12-28T06:03:25.807 に答える