2017-01-10 22 views
0

次の操作を行い、複数の日付を異なる列に渡します。ただし、2番目の列(時間)列はこの文字列に準拠していないため、エラーが発生します。どのように私はこれを達成するのですか?Pandas DataFrame/HDFStore CSVで複数の日付フォーマットを渡す

dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y %H:%M:%S') 

for chunk in pd.read_csv(file, chunksize=500000, parse_dates=['date','time'], parse_dates = dateparse, names = col_names, index_col = index_cols, header = 0, dtype = dtype) 
     store.append('df',chunk) 

サンプルデータ:

Date      Time 
19/10/2016 00:00:00  00:05:01 
+0

なっ意味

あなたは 'parse_dates = dateparse'一部と' parse_dates =指定[[ '日付を'、 '時間']] 'を、結合しますどの除外単にみました日付と時刻を1つの列に変換しますか? – chthonicdaemon

+0

サンプルデータを生のCSVとして投稿した方が良いでしょう(テキストエディタで開き、そこからコピー&ペースト)。 – chthonicdaemon

+0

私はここに2つのオプションがあると思います - 'Time'カラムに日付部分を追加して' datetime'に変換するか、 'timedelta64 [ns]' dtypeに変換してください – MaxU

答えて

2

あなたは'19/10/2016 00:00:00'のような標準フォーマットを持っている場合、日時書式を指定する必要はありません - パンダは、それを自動的に解析しますので、あなたはdate_parserパラメータを使用する必要はありません。

for chunk in pd.read_csv(file, chunksize=500000, parse_dates=['Date'], names=col_names, index_col=index_cols, dtype = dtype): 
    chunk['Time'] = chunk['Date'].dt.normalize() + pd.to_timedelta(chunk['Time']) 
    store.append('df',chunk) 

オプション2:変換TimeカラムDTYPE timedelta64[ns]に:Time列DTYPE datetime64[ns]に変換:

オプション1は

for chunk in pd.read_csv(file, chunksize=500000, parse_dates=['Date'], names=col_names, index_col=index_cols, dtype = dtype): 
    chunk['Time'] = pd.to_timedelta(chunk['Time']) 
    store.append('df',chunk) 

PSの両方が挙げdtypesはHDFStoreによって支持されています

オプション3:

for chunk in pd.read_csv(file, chunksize=500000, names=col_names, index_col=index_cols, dtype = dtype): 
    chunk['Date'] = pd.to_datetime(chunk['Date'], errors='coerce') 
    chunk['Time'] = pd.to_timedelta(chunk['Time'], errors='coerce') 
    store.append('df',chunk) 
+0

ありがとうMaxU。値を明示的に解析する理由は、このデータはユーザーが入力したためにエラーが発生しやすいためです。私は明示的にそれを解析せず、日付/時刻の列にエラーがあり、これがオブジェクトになるでしょうか?そして、次のチャンクをクリーンなデータ/新しいCSVを同じストアに追加しようとすると、もう一度問題になります。それが私が明示的に明示することを望んだ理由です。 – CodeGeek123

+0

@ CodeGeek123、これはあなたが "オプション3"(答えの更新を参照)に行きたいかもしれません – MaxU

+0

すごい!ありがとうございました! :) – CodeGeek123

1

あなたはthe documentationに指定されているparse_datesにだけではなく、リストのリストのリストを渡すことで、一つの列に日付と時刻の列を結合するためにパンダを伝えることができます。

parse_dates:ブールまたはint型または名前やリストや辞書のリストのリスト、falseデフォルト

  • ブール値。 Trueの場合 - >インデックスの解析を試みます。
  • intまたはnameのリスト。例えば[1、2、3] - >列1、2、3を別々の日付列として解析しようとすると。
  • リストのリスト。例えば[[1,3]] - >列1と列3を結合し、 として単一の日付列を解析します。例えば、 dict {「foo」で:[1、3]} - >パース列1、3日と呼び出し結果として「foo」であなたはまた、あなたの日付フォーマット与えdayfirst=Trueを指定することをお勧めします

。あなたのコードが

for chunk in pd.read_csv(file, chunksize=500000, 
         parse_dates=[['date', 'time']], # note the extra [] 
         dayfirst=True, 
         names=col_names, index_col=index_cols, 
         header=0, dtype=dtype) 
    store.append('df',chunk) 
関連する問題