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?

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

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')

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


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.


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)

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


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'>

0

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


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]

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())
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.