In[31]: dfOut[31]:
a time012013-01-01122013-01-02232013-01-03In[32]: df['time']= df['time'].astype('datetime64[ns]')In[33]: dfOut[33]:
a time012013-01-0100:00:00122013-01-0200:00:00232013-01-0300:00:00
Bagus - terima kasih - bagaimana cara menghilangkan 00:00:00 di akhir setiap kencan?
user7289
1
Stempel waktu panda memiliki tanggal dan waktu. Apakah maksud Anda mengubahnya menjadi objek tanggal python?
waitingkuo
7
Anda dapat mengubahnya dengandf['time'] = [time.date() for time in df['time']]
waitingkuo
3
apa artinya [ns], dapatkah Anda membuat string teks menjadi tanggal dan menghapus bagian waktu dari tanggal itu?
yoshiserry
1
@yoshiserry itu nanodetik, dan merupakan cara tanggal disimpan di bawah tenda setelah diubah dengan benar (waktu-waktu dalam nanodetik).
Andy Hayden
114
Pada dasarnya setara dengan @waitingkuo, tetapi saya akan menggunakan di to_datetimesini (sepertinya sedikit lebih bersih, dan menawarkan beberapa fungsi tambahan misalnya dayfirst):
In[11]: df
Out[11]:
a time
012013-01-01122013-01-02232013-01-03In[12]: pd.to_datetime(df['time'])Out[12]:02013-01-0100:00:0012013-01-0200:00:0022013-01-0300:00:00Name: time, dtype: datetime64[ns]In[13]: df['time']= pd.to_datetime(df['time'])In[14]: df
Out[14]:
a time
012013-01-0100:00:00122013-01-0200:00:00232013-01-0300:00:00
Penanganan ValueErrors
Jika Anda mengalami situasi di mana melakukan
df['time']= pd.to_datetime(df['time'])
Melempar a
ValueError:Unknown string format
Itu berarti Anda memiliki nilai yang tidak valid (tidak dapat dipaksakan). Jika Anda setuju untuk mengubahnya menjadi pd.NaT, Anda dapat menambahkan errors='coerce'argumen ke to_datetime:
Hai Teman-teman, @AndyHayden bisakah kamu menghapus bagian waktu dari tanggal? Saya tidak butuh bagian itu?
yoshiserry
Dalam pandas '0.13.1, tanda 00: 00: 00s tidak ditampilkan.
Andy Hayden
dan bagaimana dengan versi lain, bagaimana kita menghapus / dan atau tidak menampilkannya?
yoshiserry
Saya tidak berpikir ini bisa dilakukan dengan cara yang baik, ada diskusi untuk menambahkan date_format seperti float_format (yang telah Anda lihat). Saya sarankan untuk meningkatkan.
Andy Hayden
masalah saya adalah tanggal saya dalam format ini ... 41516.43, dan saya mendapatkan kesalahan ini. Saya mengharapkannya untuk mengembalikan sesuatu seperti 2014-02-03 di kolom baru ?! KESALAHAN: #convert nilai tanggal di kolom "load_date" ke tanggal budget_dataset ['date_last_load'] = pd.to_datetime (budget_dataset ['load_date']) budget_dataset -c: 2: SettingWithCopyWarning: Sebuah nilai mencoba disetel pada salinan potongan dari DataFrame. Coba gunakan .loc [row_index, col_indexer] = value sebagai gantinya
yoshiserry
36
Saya membayangkan banyak data yang masuk ke Pandas dari file CSV, dalam hal ini Anda cukup mengonversi tanggal selama pembacaan CSV awal:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])di mana 0 mengacu pada kolom tanggal masuk
Anda juga bisa menambahkan , index_col=0di sana jika Anda ingin tanggal menjadi indeks Anda.
Sekarang Anda bisa melakukannya df['column'].dt.date
Perhatikan bahwa untuk objek datetime, jika Anda tidak melihat jam saat semuanya 00:00:00, itu bukan panda. Itu notebook iPython mencoba membuat segalanya terlihat cantik.
Yang ini tidak berfungsi untuk saya, ia mengeluh: Hanya dapat menggunakan aksesor .dt dengan nilai yang
mirip dengan
2
Anda mungkin harus melakukan df[col] = pd.to_datetime(df[col])terlebih dahulu untuk mengubah kolom Anda menjadi objek waktu tanggal.
szeitlin
Masalah dengan jawaban ini adalah bahwa itu mengubah kolom dtype = objectyang membutuhkan lebih banyak memori daripada yang benar datetime dtypedi panda.
elPastor
6
Cara lain untuk melakukan ini dan ini berfungsi dengan baik jika Anda memiliki beberapa kolom untuk dikonversi ke datetime.
Pertanyaan menanyakan tanggal bukan tanggal waktu.
Mark Andersen
@MarkAndersen selama Anda datehanya memiliki nilai di kolom Anda, konversi ke datetime hanya akan menyimpan informasi terkait. Jika Anda secara eksplisit mengkonversi menggunakan df['datetime_col'].dt.dateitu akan menghasilkan objectdtype; kehilangan dalam manajemen memori.
Sumanth Lazarus
6
Jika Anda ingin mendapatkan format DATE dan bukan DATETIME:
Mungkin saja tanggal perlu diubah ke frekuensi yang berbeda. Dalam hal ini, saya menyarankan untuk menetapkan indeks berdasarkan tanggal.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Setelah ini, Anda dapat lebih mudah mengonversi ke jenis format tanggal yang paling Anda perlukan. Di bawah ini, saya secara berurutan mengonversi ke sejumlah format tanggal, yang akhirnya berakhir dengan serangkaian tanggal harian di awal bulan.
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)#Convert to monthly dates
df.index = df.index.to_period(freq='M')#Convert to strings
df.index = df.index.strftime('%Y-%m')#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
Singkatnya, saya tidak menunjukkan bahwa saya menjalankan kode berikut setelah setiap baris di atas:
Demi kelengkapan, opsi lain, yang mungkin bukan yang paling mudah, agak mirip dengan yang diusulkan oleh @SSS, tetapi menggunakan library datetime adalah:
df['time'] = [time.date() for time in df['time']]
Pada dasarnya setara dengan @waitingkuo, tetapi saya akan menggunakan di
to_datetime
sini (sepertinya sedikit lebih bersih, dan menawarkan beberapa fungsi tambahan misalnyadayfirst
):Penanganan
ValueError
sJika Anda mengalami situasi di mana melakukan
Melempar a
Itu berarti Anda memiliki nilai yang tidak valid (tidak dapat dipaksakan). Jika Anda setuju untuk mengubahnya menjadi
pd.NaT
, Anda dapat menambahkanerrors='coerce'
argumen keto_datetime
:sumber
Saya membayangkan banyak data yang masuk ke Pandas dari file CSV, dalam hal ini Anda cukup mengonversi tanggal selama pembacaan CSV awal:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
di mana 0 mengacu pada kolom tanggal masukAnda juga bisa menambahkan
, index_col=0
di sana jika Anda ingin tanggal menjadi indeks Anda.Lihat https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
sumber
Sekarang Anda bisa melakukannya
df['column'].dt.date
Perhatikan bahwa untuk objek datetime, jika Anda tidak melihat jam saat semuanya 00:00:00, itu bukan panda. Itu notebook iPython mencoba membuat segalanya terlihat cantik.
sumber
df[col] = pd.to_datetime(df[col])
terlebih dahulu untuk mengubah kolom Anda menjadi objek waktu tanggal.dtype = object
yang membutuhkan lebih banyak memori daripada yang benardatetime dtype
di panda.Cara lain untuk melakukan ini dan ini berfungsi dengan baik jika Anda memiliki beberapa kolom untuk dikonversi ke datetime.
sumber
date
hanya memiliki nilai di kolom Anda, konversi ke datetime hanya akan menyimpan informasi terkait. Jika Anda secara eksplisit mengkonversi menggunakandf['datetime_col'].dt.date
itu akan menghasilkanobject
dtype; kehilangan dalam manajemen memori.Jika Anda ingin mendapatkan format DATE dan bukan DATETIME:
sumber
Mungkin saja tanggal perlu diubah ke frekuensi yang berbeda. Dalam hal ini, saya menyarankan untuk menetapkan indeks berdasarkan tanggal.
Setelah ini, Anda dapat lebih mudah mengonversi ke jenis format tanggal yang paling Anda perlukan. Di bawah ini, saya secara berurutan mengonversi ke sejumlah format tanggal, yang akhirnya berakhir dengan serangkaian tanggal harian di awal bulan.
Singkatnya, saya tidak menunjukkan bahwa saya menjalankan kode berikut setelah setiap baris di atas:
Ini memberi saya output berikut:
sumber
Coba ubah salah satu baris menjadi stempel waktu menggunakan fungsi pd.to_datetime, lalu gunakan .map untuk memetakan formular ke seluruh kolom
sumber
sumber
Demi kelengkapan, opsi lain, yang mungkin bukan yang paling mudah, agak mirip dengan yang diusulkan oleh @SSS, tetapi menggunakan library datetime adalah:
sumber