datetime dtypes di pandas read_csv

127

Saya membaca di file csv dengan beberapa kolom datetime. Saya perlu mengatur tipe data setelah membaca di file, tetapi datetimes tampaknya menjadi masalah. Misalnya:

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = ['datetime', 'datetime', 'str', 'float']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Ketika dijalankan memberikan kesalahan:

TypeError: tipe data "datetime" tidak dipahami

Mengonversi kolom setelah fakta, melalui pandas.to_datetime () bukanlah opsi Saya tidak tahu kolom mana yang akan menjadi objek datetime. Informasi tersebut dapat berubah dan berasal dari apapun yang menginformasikan daftar dtypes saya.

Atau, saya telah mencoba memuat file csv dengan numpy.genfromtxt, mengatur dtypes dalam fungsi itu, dan kemudian mengonversinya ke pandas.dataframe tetapi itu mengacaukan data. Bantuan apa pun sangat dihargai!

pengguna3221055
sumber

Jawaban:

273

Mengapa tidak berhasil

Tidak ada tipe dtwaktu yang akan disetel untuk read_csv karena file csv hanya dapat berisi string, integer, dan float.

Menyetel dtype ke datetime akan membuat panda menafsirkan datetime sebagai objek, artinya Anda akan berakhir dengan string.

Panda cara memecahkan ini

The pandas.read_csv()fungsi memiliki argumen kata kunci yang disebutparse_dates

Menggunakan ini, Anda dapat dengan cepat mengubah string, float atau integer menjadi datetimes menggunakan default date_parser( dateutil.parser.parser)

headers = ['col1', 'col2', 'col3', 'col4']
dtypes = {'col1': 'str', 'col2': 'str', 'col3': 'str', 'col4': 'float'}
parse_dates = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes, parse_dates=parse_dates)

Ini akan menyebabkan panda membaca col1dan col2sebagai string, yang kemungkinan besar adalah ("2016-05-05" dll.) Dan setelah membaca string tersebut, date_parser untuk setiap kolom akan bertindak atas string itu dan mengembalikan apa pun yang dikembalikan fungsi itu .

Menentukan fungsi penguraian tanggal Anda sendiri:

The pandas.read_csv()Fungsi juga memiliki argumen kata kunci yang disebutdate_parser

Menyetel ini ke fungsi lambda akan membuat fungsi tersebut digunakan untuk penguraian tanggal.

PERINGATAN GOTCHA

Anda harus memberikan fungsinya, bukan eksekusi fungsinya, jadi ini benar

date_parser = pd.datetools.to_datetime

Ini salah :

date_parser = pd.datetools.to_datetime()

Pembaruan Pandas 0.22

pd.datetools.to_datetime telah dipindahkan ke date_parser = pd.to_datetime

Terima kasih @ackoverYC

firelynx
sumber
1
@ Drake Saya pikir user3221055 tidak pernah benar-benar kembali ke situs. Itulah masalahnya. Profil mengatakan "Terakhir terlihat 20 Mei '14 pukul 2:35"
firelynx
2
Ini adalah solusi yang lambat. Lihat ini sebagai gantinya: stackoverflow.com/questions/29882573/…
user1761806
@ user1761806 Hai, temuan bagus! Aku membuat yang lebih baik. stackoverflow.com/a/46183514/3730397
firelynx
2
Pada pandas 0.22.0 mengatakan pandas.core.datetools.to_datetimetidak digunakan lagi, gunakan pd.datetools.to_datetimesaja. seperti ini:date_parser = pd.to_datetime
stackoverYC
1
Ada juga convertersparameter di mana Anda dapat menentukan kolom mana yang memiliki konverter mana. parse_dates sangat membantu dan menangani data yang buruk tetapi lebih lambat karena itu menguji dan menyimpulkan setiap nilai gist.github.com/gjreda/7433f5f70299610d9b6b
Davos
31

Ada parse_datesparameter read_csvyang memungkinkan Anda untuk menentukan nama kolom yang ingin Anda perlakukan sebagai tanggal atau waktu:

date_cols = ['col1', 'col2']
pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=date_cols)
mrjrdnthms.dll
sumber
Saya mengalami kesalahan karena saya melewati nama string tunggal kolom, sekarang saya mengerti bahwa saya perlu melewati daftar untuk satu nilai juga.
TapanHP
15

Anda dapat mencoba meneruskan tipe sebenarnya alih-alih string.

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Tetapi akan sangat sulit untuk mendiagnosis ini tanpa data Anda untuk diotak-atik.

Dan sungguh, Anda mungkin ingin panda mengurai tanggal menjadi Stempel Waktu, jadi itu mungkin:

pd.read_csv(file, sep='\t', header=None, names=headers, parse_dates=True)
Paul H.
sumber
7

Saya mencoba menggunakan opsi dtypes = [datetime, ...], tapi

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime, datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)

Saya mengalami kesalahan berikut:

TypeError: data type not understood

Satu-satunya perubahan yang harus saya lakukan adalah mengganti datetime dengan datetime.datetime

import pandas as pd
from datetime import datetime
headers = ['col1', 'col2', 'col3', 'col4'] 
dtypes = [datetime.datetime, datetime.datetime, str, float] 
pd.read_csv(file, sep='\t', header=None, names=headers, dtype=dtypes)
Jose Buraschi
sumber
3
Ini masih akan membuat dtype dari kerangka data yang dihasilkan sebagai objek, bukan pandas.datetime
firelynx
11
Selain dari fakta bahwa ini tidak memiliki efek yang diinginkan, itu juga tidak berhasil:AttributeError: type object 'datetime.datetime' has no attribute 'datetime'
Gabriel