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?
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:
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
df['time'] = [time.date() for time in df['time']]
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')
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
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.
df[col] = pd.to_datetime(df[col])terlebih dahulu untuk mengubah kolom Anda menjadi objek waktu tanggal.
dtype = objectyang membutuhkan lebih banyak memori daripada yang benar datetime dtypedi panda.
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)
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.
Jika Anda ingin mendapatkan format DATE dan bukan DATETIME:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
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'>
Coba ubah salah satu baris menjadi stempel waktu menggunakan fungsi pd.to_datetime, lalu gunakan .map untuk memetakan formular ke seluruh kolom
# 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]