Saya memiliki kerangka data yang besar dengan banyak kolom, banyak di antaranya bertipe datetime.datetime
. Masalahnya adalah bahwa banyak juga yang memiliki tipe campuran, termasuk misalnya datetime.datetime
nilai dan None
nilai (dan berpotensi nilai tidak valid lainnya):
0 2017-07-06 00:00:00
1 2018-02-27 21:30:05
2 2017-04-12 00:00:00
3 2017-05-21 22:05:00
4 2018-01-22 00:00:00
...
352867 2019-10-04 00:00:00
352868 None
352869 some_string
Name: colx, Length: 352872, dtype: object
Karenanya menghasilkan object
kolom tipe. Ini bisa diselesaikan dengan df.colx.fillna(pd.NaT)
. Masalahnya adalah bahwa kerangka data terlalu besar untuk mencari kolom individual.
Pendekatan lain adalah menggunakan pd.to_datetime(col, errors='coerce')
, namun ini akan dilemparkan ke datetime
banyak kolom yang berisi nilai numerik.
Saya juga bisa melakukannya df.fillna(float('nan'), inplace=True)
, meskipun kolom yang berisi tanggal masih object
bertipe, dan masih akan memiliki masalah yang sama.
Pendekatan apa yang bisa saya ikuti untuk melemparkan ke datetime kolom-kolom yang nilainya benar-benar berisi datetime
nilai-nilai, tetapi juga bisa mengandung None
, dan berpotensi beberapa nilai yang tidak valid (menyebutkan karena kalau tidak pd.to_datetime
dalam a try
/ except
klausa akan lakukan)? Sesuatu seperti versi fleksibelpd.to_datetime(col)
datetime.datetime
ataupandas._libs.tslibs.timestamps.Timestamp
? Jika mantan rekomendasi saya akan mengubah apa pun yang menciptakan datetime ke jenis yangpandas
menangani sedikit lebih baik.None
di kolom Anda, aktualNone
atau string perwakilannya?None
bukan string. Nilai yang berpotensi salah juga ... @erfandatetime
danvalues
di dalamnya?Jawaban:
Masalah utama yang saya lihat adalah ketika mem-parsing nilai numerik.
Saya akan mengusulkan untuk mengubahnya menjadi string terlebih dahulu
Mendirikan
Larutan
sumber
pd.to_datetime
dancoerce
kesalahan, karena ada banyak. Masalahnya dengan kolom numerik. Tetapi tidak terpikir oleh saya bahwa kolom numerik yang dilemparkan ke string tidak diuraikan oleh panda 'to_datetime
. Terima kasih banyak, ini sangat membantu!Fungsi ini akan mengatur tipe data kolom ke datetime, jika ada nilai dalam kolom yang cocok dengan pola regex (\ d {4} - \ d {2} - \ d {2}) + (mis. 2019-01-01 ). Terima kasih atas jawaban ini tentang cara Mencari String di semua kolom dan filter PandF DataFrame yang membantu pengaturan dan penerapan mask.
Bekerja dari saran untuk digunakan
dateutil
, ini dapat membantu. Masih bekerja pada anggapan bahwa jika ada nilai seperti tanggal dalam kolom, bahwa kolom harus menjadi datetime. Saya mencoba mempertimbangkan berbagai metode iterasi dataframe yang lebih cepat. Saya pikir jawaban ini tentang Bagaimana cara mengulangi baris dalam DataFrame di Pandas melakukan pekerjaan dengan baik menggambarkan mereka.Perhatikan bahwa
dateutil.parser
akan menggunakan hari atau tahun saat ini untuk string seperti 'Desember' atau 'November 2019' tanpa nilai tahun atau hari.Jika Anda juga ingin menggunakan nilai datatime dari
dateutil.parser
, Anda dapat menambahkan ini:sumber
dateutil
modul yang disebutkan oleh @Serge itu sepertinya bisa berguna.dateutil.parse
mengidentifikasi berbagai jenis string tanggal.