Bagaimana cara mengonversi numpy.datetime64
objek ke datetime.datetime
(atau Timestamp
)?
Dalam kode berikut, saya membuat objek datetime, timestamp dan datetime64.
import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)
In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)
In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>
In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')
Catatan: mudah untuk mendapatkan datetime dari Timestamp:
In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)
Tetapi bagaimana kita mengekstrak datetime
atau Timestamp
dari numpy.datetime64
( dt64
)?
.
Pembaruan: contoh yang agak buruk dalam dataset saya (mungkin contoh yang memotivasi) tampaknya:
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
yang seharusnya datetime.datetime(2002, 6, 28, 1, 0)
, dan tidak lama (!) ( 1025222400000000000L
) ...
numpy
,pandas
versi.pd.Timestamp(dt64).to_datetime()
. Saya masih sedikit tidak puas tentang ini, tetapi tentu saja Wes kurang spesifik untuk masalah lama saya (dan jadi lebih baik untuk dunia)! Sekali lagi terima kasih telah meluangkan waktu untuk menjawabnya. :)Timestamp
" danTimestamp
apakahdatetime
(subkelas) :)Jawaban:
Untuk mengkonversi
numpy.datetime64
ke objek datetime yang mewakili waktu dalam UTC padanumpy-1.8
:Contoh di atas mengasumsikan bahwa objek datetime naif ditafsirkan
np.datetime64
sebagai waktu dalam UTC.Untuk mengonversi datetime ke np.datetime64 dan kembali (
numpy-1.6
):Ia bekerja baik pada objek np.datetime64 tunggal dan array np.datetime64.
Pikirkan np.datetime64 dengan cara yang sama dengan np.int8, np.int16, dll dan terapkan metode yang sama untuk mengkonversi antara objek Python seperti int, datetime, dan objek numpy yang sesuai.
"Contoh buruk" Anda berfungsi dengan benar:
Saya dapat mereproduksi
long
nilai padanumpy-1.8.0
diinstal sebagai:Contoh yang sama:
Ini mengembalikan
long
karena untuknumpy.datetime64
tipe.astype(datetime)
sama dengan.astype(object)
yang mengembalikan Python integer (long
) padanumpy-1.8
.Untuk mendapatkan objek datetime Anda bisa:
Untuk mendapatkan datetime64 yang menggunakan detik secara langsung:
The docs numpy mengatakan bahwa datetime API adalah eksperimental dan dapat berubah dalam versi numpy masa depan.
sumber
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, yang memberi waktu (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
type(dt64)
adalahnumpy.datetime64
dandt64.astype(datetime)
adalah int ... (s)numpy.__version__
->'1.6.1'
Anda cukup menggunakan konstruktor pd.Timestamp. Diagram berikut mungkin berguna untuk ini dan pertanyaan terkait.
sumber
pd.to_datetime
mengubah segalanya menjadipd.Timestamp
. Sebuahpd.Timestamp
benda memiliki metodeto_pydatetime
untuk kembali kedatetime.datetime
objek danto_datetime64
metode untuk mengkonversi kenp.datetime64
.Selamat Datang di neraka.
Anda bisa meneruskan objek datetime64 ke
pandas.Timestamp
:Saya perhatikan bahwa ini tidak berfungsi dengan baik di NumPy 1.6.1:
Juga,
pandas.to_datetime
dapat digunakan (ini off dari versi dev, belum dicentang v0.9.1):sumber
issubclass(pd.Timestamp, datetime)
adalahTrue
. DanTimestamp
kelas itu sendiri memilikito_datetime()
metode.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
mengembalikanTimestamp('2012-05-01 00:00:00')
setidaknya dalam panda0.17.1
.Saya pikir mungkin ada upaya yang lebih terkonsolidasi dalam jawaban untuk lebih menjelaskan hubungan antara modul datetime Python, datetime numpy64 / timedelta64 dan objek Timestamp / Timedelta panda.
Pustaka standar datetime dari Python
Pustaka standar datetime memiliki empat objek utama
Buat empat objek ini
Objek datetime64 dan timedelta64 NumPy
NumPy tidak memiliki objek tanggal dan waktu yang terpisah, hanya objek datetime64 tunggal untuk mewakili satu momen dalam waktu. Objek datetime modul datetime memiliki presisi mikrodetik (sepersejuta detik). Objek datetime64 NumPy memungkinkan Anda untuk mengatur presisi dari jam sampai ke attoseconds (10 ^ -18). Konstruktornya lebih fleksibel dan dapat mengambil berbagai input.
Bangun objek datetime64 dan timedelta64 NumPy
Berikan bilangan bulat dengan string untuk unit. Lihat semua unit di sini . Itu akan dikonversi ke banyak unit setelah zaman UNIX: 1 Januari 1970
Anda juga dapat menggunakan string selama masih dalam format ISO 8601.
Timedeltas memiliki satu unit
Bisa juga membuatnya dengan mengurangi dua objek datetime64
Pandas Timestamp dan Timedelta membangun lebih banyak fungsi di atas NumPy
Sebuah cap waktu panda adalah momen dalam waktu yang sangat mirip dengan datetime tetapi dengan lebih banyak fungsi. Anda dapat membangunnya dengan
pd.Timestamp
ataupd.to_datetime
.pd.to_datetime
berfungsi sangat mirip (dengan beberapa opsi lagi) dan dapat mengonversi daftar string menjadi Stempel Waktu.Mengubah datetime Python ke datetime64 dan Timestamp
Mengubah datetime numpy ke datetime dan Timestamp
Konversikan ke Stempel Waktu
Konversi dari Timestamp ke datetime dan datetime64
Ini cukup mudah karena cap waktu panda sangat kuat
sumber
Sebab
DatetimeIndex
,tolist
mengembalikan daftardatetime
objek. Untuk satudatetime64
objek, ia mengembalikan satudatetime
objek.sumber
.item()
yang jauh lebih eksplisit (dan tidak ada yang bisa datang dan mulai berdebat bahwa itu harus mengembalikan daftar).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, yang memberi waktu (1025222400000000000L
) (!).item()
(disarankan oleh @seberg),.tolist()
tergantung pada unit apa yang digunakan datetime64 misalnya,D
menghasilkandatetime.date()
,us
(mikrodetik) menghasilkandatetime.datetime()
,ns
(nanodetik) menghasilkanlong
. Dan unit berubah tergantung pada nilai input misalnya,numpy.datetime64('2012-05-01')
menggunakan'D'
,numpy.datetime64('2012-05-01T00:00:00.000')
menggunakanms
,numpy.datetime64('2012-05-01T00:00:00.000000000')
menggunakanns
. Anda dapat membuka masalah jika ternyata membingungkan.Jika Anda ingin mengonversi seluruh rangkaian data panda menjadi datetime python biasa, Anda juga bisa menggunakan
.to_pydatetime()
.Ini juga mendukung zona waktu:
CATATAN : Jika Anda beroperasi pada Seri Pandas Anda tidak dapat memanggil
to_pydatetime()
seluruh seri. Anda perlu memanggil.to_pydatetime()
setiap dat 64 individu menggunakan pemahaman daftar atau yang serupa:sumber
Salah satu opsi adalah menggunakan
str
, dan kemudianto_datetime
(atau serupa):Catatan: tidak sama dengan
dt
karena menjadi "offset-aware" :Ini tampaknya tidak elegan.
.
Pembaruan: ini bisa berurusan dengan "contoh buruk":
sumber
Posting ini telah berlangsung selama 4 tahun dan saya masih berjuang dengan masalah konversi ini - jadi masalah ini masih aktif di 2017 dalam beberapa hal. Saya agak terkejut bahwa dokumentasi numpy tidak mudah menawarkan algoritma konversi yang sederhana tapi itu cerita lain.
Saya telah menemukan cara lain untuk melakukan konversi yang hanya melibatkan modul
numpy
dandatetime
, itu tidak memerlukan panda untuk diimpor yang menurut saya menjadi banyak kode untuk diimpor untuk konversi yang sederhana. Saya perhatikan bahwadatetime64.astype(datetime.datetime)
akan mengembalikandatetime.datetime
objek jika aslinyadatetime64
dalam satuan mikro-detik sedangkan unit lain mengembalikan cap waktu bilangan bulat. Saya menggunakan modulxarray
untuk data I / O dari file Netcdf yang menggunakandatetime64
unit dalam nanosecond membuat konversi gagal kecuali Anda pertama kali mengkonversi ke unit mikro-detik. Berikut adalah contoh kode konversi,Hanya diuji pada mesin saya, yaitu Python 3.6 dengan distribusi Anaconda 2017 baru-baru ini. Saya hanya melihat konversi skalar dan belum memeriksa konversi berbasis array meskipun saya kira itu akan baik. Saya juga tidak melihat kode sumber datetime64 numpy untuk melihat apakah operasi masuk akal atau tidak.
sumber
Saya telah kembali ke jawaban ini lebih dari yang dapat saya hitung, jadi saya memutuskan untuk menyatukan kelas kecil cepat, yang mengubah
datetime64
nilai Numpy menjadi nilai Pythondatetime
. Saya harap ini membantu orang lain di luar sana.Saya akan menyimpan ini di tas alat saya, sesuatu memberitahu saya saya akan membutuhkannya lagi.
sumber
ts.to_pydatetime()
gunakan fungsi ini untuk mendapatkan objek datetime ular piton asli
sumber
replace() got an unexpected keyword argument 'tzinfo'
Beberapa solusi bekerja dengan baik untuk saya tetapi numpy akan mencabut beberapa parameter. Solusi yang bekerja lebih baik bagi saya adalah dengan membaca tanggal sebagai waktu panda dan mencabut secara eksplisit tahun, bulan dan hari objek panda. Kode berikut berfungsi untuk situasi yang paling umum.
sumber
memang, semua tipe data ini bisa sulit, dan berpotensi bermasalah (harus tetap berhati-hati dengan informasi zona waktu). inilah yang telah saya lakukan, meskipun saya akui bahwa saya khawatir bahwa setidaknya sebagian dari itu adalah "bukan oleh desain". juga, ini dapat dibuat sedikit lebih kompak sesuai kebutuhan. dimulai dengan numpy.datetime64 dt_a:
numpy.datetime64 ('2015-04-24T23: 11: 26.270000-0700')
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... dan tentu saja, itu dapat dikompresi menjadi satu baris sesuai kebutuhan.
sumber
edit
sesuaikan dengan yang semestinya: pemformatan kode, pemformatan kutipan, dan pemformatan teks. Selain itu, harap patuhi huruf besar, tata bahasa, dan periksa salah ketik, sesuai dengan pedoman SO - lihat: Cara Mengirim , dan Sampel Kode