Hari ini saya sangat terkejut dengan fakta bahwa saat membaca data dari file data (misalnya) panda mampu mengenali jenis nilai:
df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3'])
Misalnya itu dapat diperiksa dengan cara ini:
for i, r in df.iterrows():
print type(r['col1']), type(r['col2']), type(r['col3'])
Khususnya bilangan bulat, pelampung dan string dikenali dengan benar. Namun, saya memiliki kolom yang memiliki tanggal dalam format berikut: 2013-6-4
. Tanggal-tanggal ini dikenali sebagai string (bukan sebagai objek-tanggal python). Apakah ada cara untuk "mempelajari" panda hingga tanggal yang dikenali?
df.iterrows()
dan melihatnya untuk setiap baris, lakukandf.info()
sekali saja.Jawaban:
Anda harus menambahkan
parse_dates=True
, atauparse_dates=['column name']
ketika membaca, itu biasanya cukup untuk menguraikannya secara ajaib. Tetapi selalu ada format aneh yang perlu didefinisikan secara manual. Dalam kasus seperti itu, Anda juga dapat menambahkan fungsi pengurai tanggal, yang merupakan cara paling fleksibel.Misalkan Anda memiliki kolom 'datetime' dengan string Anda, maka:
Dengan cara ini Anda bahkan dapat menggabungkan beberapa kolom ke dalam kolom datetime tunggal, ini menggabungkan kolom 'tanggal' dan 'waktu' ke dalam kolom 'datetime' tunggal:
Anda dapat menemukan arahan (yaitu huruf-huruf yang akan digunakan untuk format yang berbeda) untuk
strptime
danstrftime
di halaman ini .sumber
TypeError: strptime() argument 1 must be str, not float
infer_datetime_format
: "panda akan berusaha menyimpulkan format string datetime di kolom". Ini bisa digunakan sebagai gantidate_parser
.ISO 8601
format Anda tidak boleh lewatinfer_datetime_format
atau fungsi parser - ini jauh lebih lambat daripada membiarkan panda menanganinya (terutama yang terakhir). Format tanggal dalam jawaban ini juga termasuk dalam kategori iniMungkin antarmuka panda telah berubah sejak @Rutger menjawab, tetapi dalam versi yang saya gunakan (0.15.2),
date_parser
fungsi tersebut menerima daftar tanggal alih-alih nilai tunggal. Dalam hal ini, kodenya harus diperbarui seperti ini:sumber
Metode read_csv panda bagus untuk tanggal parsing. Dokumentasi lengkap di http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html
Anda bahkan dapat memiliki bagian tanggal yang berbeda di kolom yang berbeda dan meneruskan parameter:
Penginderaan default dari tanggal bekerja dengan baik, tetapi tampaknya bias terhadap format tanggal Amerika utara. Jika Anda tinggal di tempat lain, Anda terkadang ketahuan dengan hasilnya. Sejauh yang saya ingat 1/6/2000 berarti 6 Januari di AS dibandingkan 1 Juni tempat saya tinggal. Cukup cerdas untuk mengayunkannya jika tanggal seperti 23/6/2000 digunakan. Mungkin lebih aman untuk tetap dengan variasi tanggal YYYYMMDD sekalipun. Permintaan maaf kepada pengembang panda, di sini tetapi saya belum mengujinya dengan tanggal lokal baru-baru ini.
Anda dapat menggunakan parameter date_parser untuk melewatkan fungsi untuk mengonversi format Anda.
sumber
dayfirst
Benar untuk tanggal Eropa / internasional. pandas.pydata.org/pandas-docs/stable/generated/…Anda dapat menggunakan
pandas.to_datetime()
seperti yang direkomendasikan dalam dokumentasi untukpandas.read_csv()
:Demo:
sumber
Ketika menggabungkan dua kolom menjadi kolom datetime tunggal, jawaban yang diterima menghasilkan kesalahan (versi panda 0.20.3), karena kolom dikirim ke fungsi date_parser secara terpisah.
Karya-karya berikut:
sumber
Ya - sesuai dengan
pandas.read_csv
dokumentasi :Jadi jika csv Anda memiliki nama kolom
datetime
dan tanggalnya seperti2013-01-01T01:01
misalnya, menjalankan ini akan membuat panda (saya di v0.19.2) mengambil tanggal dan waktu secara otomatis:df = pd.read_csv('test.csv', parse_dates=['datetime'])
Perhatikan bahwa Anda harus lulus secara eksplisit
parse_dates
, itu tidak berfungsi tanpa.Verifikasi dengan:
df.dtypes
Anda harus melihat tipe data dari kolom tersebut
datetime64[ns]
sumber
Jika kinerja penting bagi Anda, pastikan waktu Anda:
cetakan:
Jadi dengan tanggal yang diformat iso8601 (
%Y-%m-%d %H:%M:%S
tampaknya tanggal yang diformat iso8601, saya kira T dapat dijatuhkan dan diganti dengan spasi) Anda tidak boleh menentukaninfer_datetime_format
(yang tidak membuat perbedaan dengan yang lebih umum baik tampaknya) dan melewati Anda sendiri parser hanya dalam kinerja melumpuhkan. Di sisi lain,date_parser
tidak membuat perbedaan dengan format hari tidak begitu standar. Pastikan waktu sebelum Anda mengoptimalkan, seperti biasa.sumber
Saat memuat file csv berisi kolom tanggal. Kami memiliki dua pendekatan untuk membuat panda untuk mengenali kolom tanggal yaitu
Pandas secara eksplisit mengenali format dengan arg
date_parser=mydateparser
Pandas secara implisit mengenali format oleh agr
infer_datetime_format=True
Beberapa data kolom tanggal
01/01/18
01/02/18
Di sini kita tidak tahu dua hal pertama. Mungkin bulan atau hari. Jadi dalam hal ini kita harus menggunakan Metode 1: - Secara eksplisit lulus format
Metode 2: - Secara implisit atau secara otomatis mengenali format
sumber