Pandalar veri çerçevem var, sütunlardan biri formattaki tarih dizelerini içeriyor YYYY-MM-DD
Örneğin '2013-10-28'
Şu anda dtype
sütun var object
.
Sütun değerlerini Pandas tarih biçimine nasıl dönüştürebilirim?
Yanıtlar:
Kullanım 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']]
Esasen @waitingkuo'ya eşdeğer, ancak to_datetime
burada kullanacağım (biraz daha temiz görünüyor ve bazı ek işlevler sunuyor, örneğin 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
Taşıma ValueError
s
yapıyor nerede bir durumla karşılaşırsanız
df['time'] = pd.to_datetime(df['time'])
Atar
ValueError: Unknown string format
Bu, geçersiz (zorlayıcı olmayan) değerlere sahip olduğunuz anlamına gelir. Bunların dönüştürülmesinde sorun pd.NaT
yoksa, şuna bir errors='coerce'
argüman ekleyebilirsiniz to_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
Pandalar'a CSV dosyalarından çok fazla veri geldiğini hayal ediyorum, bu durumda tarihi ilk CSV okuması sırasında kolayca dönüştürebilirsiniz:
dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])
Burada 0, tarihin bulunduğu sütunu ifade eder. Tarihin dizininiz olmasını istiyorsanız oraya
da ekleyebilirsiniz , index_col=0
.
Bkz. Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
Şimdi yapabilirsin df['column'].dt.date
Datetime nesneleri için, tümünün 00:00:00 olduğu saati görmezseniz, bunun panda olmadığını unutmayın. Bu, işleri güzel göstermeye çalışan iPython dizüstü bilgisayar.
df[col] = pd.to_datetime(df[col])
önce sütununuzu tarih saat nesnelerine dönüştürmek için yapmanız gerekebilir .
dtype = object
olduğundan çok daha fazla bellek alan sütunu dönüştürmesidir datetime dtype
.
DATETIME biçimini değil DATE değerini almak istiyorsanız:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
Bunu yapmanın başka bir yolu ve bu, tarih saatine dönüştürmek için birden çok sütununuz varsa iyi çalışır.
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
date
, sütunlarınızda yalnızca değerler olduğu sürece, tarih saatine dönüştürme yalnızca ilgili bilgileri tutacaktır. Açıkça dönüştürürseniz df['datetime_col'].dt.date
, bunu kullanarak bir object
dtype elde edersiniz; bellek yönetiminde kayıp.
Tarihlerin farklı bir sıklığa dönüştürülmesi gerekebilir. Bu durumda, tarihlere göre bir dizin oluşturmanızı öneririm.
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
Bundan sonra, en çok ihtiyaç duyacağınız tarih biçimine daha kolay bir şekilde dönüştürebilirsiniz. Aşağıda, sırayla bir dizi tarih biçimine dönüştürüyorum, sonuçta ayın başında bir dizi günlük tarihle son buluyorum.
#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)
Kısaca, yukarıdaki her satırdan sonra aşağıdaki kodu çalıştırdığımı göstermiyorum:
print(df.index)
print(df.index.dtype)
print(type(df.index))
Bu bana şu çıktıyı veriyor:
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'>
Pd.to_datetime işlevini kullanarak satırlardan birini zaman damgasına dönüştürmeyi deneyin ve ardından formülü tüm sütuna eşlemek için .map kullanın
# 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]