Bagaimana cara mengonversi tanggal dalam bingkai data Pandas menjadi tipe data 'tanggal'?

105

Saya memiliki bingkai data Pandas, salah satu kolom berisi string tanggal dalam format YYYY-MM-DD

Misalnya '2013-10-28'

Saat ini dtypekolom tersebut adalah object.

Bagaimana cara mengonversi nilai kolom ke format tanggal Pandas?

pengguna7289
sumber

Jawaban:

110

Gunakan astype

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00
waitingkuo
sumber
1
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
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00: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:

df['time'] = pd.to_datetime(df['time'], errors='coerce')
Andy Hayden
sumber
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.

Lihat https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

fantabolous
sumber
Terima kasih, itulah yang saya butuhkan. Dokumentasi telah dipindahkan, Anda dapat menemukannya di sini: pandas.pydata.org/pandas-docs/stable/reference/api/…
Sastibe
24

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.

szeitlin.dll
sumber
2
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.

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
SSS
sumber
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:

df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
David Valenzuela Urrutia
sumber
1

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:

print(df.index)
print(df.index.dtype)
print(type(df.index))

Ini memberi saya output berikut:

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
Ted M.
sumber
0

Coba ubah salah satu baris menjadi stempel waktu menggunakan fungsi pd.to_datetime, lalu gunakan .map untuk memetakan formular ke seluruh kolom

Mwanaidi Nicole
sumber
0
 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  object
 1   endDay          110526 non-null  object

import pandas as pd

df['startDay'] = pd.to_datetime(df.startDay)

df['endDay'] = pd.to_datetime(df.endDay)

 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  datetime64[ns]
 1   endDay          110526 non-null  datetime64[ns]
donDrey
sumber
0

Demi kelengkapan, opsi lain, yang mungkin bukan yang paling mudah, agak mirip dengan yang diusulkan oleh @SSS, tetapi menggunakan library datetime adalah:

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
rubebop
sumber