Pandas veri çerçevesindeki tarihleri ​​'tarih' veri türüne nasıl dönüştürebilirim?


107

Pandalar veri çerçevem ​​var, sütunlardan biri formattaki tarih dizelerini içeriyor YYYY-MM-DD

Örneğin '2013-10-28'

Şu anda dtypesütun var object.

Sütun değerlerini Pandas tarih biçimine nasıl dönüştürebilirim?

Yanıtlar:


115

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

1
Güzel - teşekkür ederim - her randevunun sonunda 00:00:00 saatinden nasıl kurtulabilirim?
user7289

1
Pandaların zaman damgasının hem tarihi hem de saati vardır. Python tarih nesnesine dönüştürmek mi demek istiyorsun?
Waitkuo

7
Bunu şu şekilde dönüştürebilirsinizdf['time'] = [time.date() for time in df['time']]
Waitkuo

3
[ns] ne anlama geliyor, metin dizesini bir tarih haline getirip bu tarihin saat bölümünü kaldırabilir misiniz?
yoshiserry

1
@yoshiserry bu nanosaniye ve tarihlerin düzgün bir şekilde dönüştürüldükten sonra kaputun altında saklanma şeklidir (nanosaniye cinsinden epoch-time).
Andy Hayden

116

Esasen @waitingkuo'ya eşdeğer, ancak to_datetimeburada 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 ValueErrors
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.NaTyoksa, şuna bir errors='coerce'argüman ekleyebilirsiniz to_datetime:

df['time'] = pd.to_datetime(df['time'], errors='coerce')

Merhaba Arkadaşlar, @AndyHayden tarihten saat bölümünü kaldırabilir misiniz? O kısma ihtiyacım yok mu?
yoshiserry

Pandaların 0.13.1 sürümünde sondaki 00: 00: 00'lar görüntülenmez.
Andy Hayden

peki ya diğer sürümlerde, onları nasıl kaldırırız / veya göstermeyiz?
yoshiserry

Bunun güzel bir şekilde yapılabileceğini sanmıyorum, float_format gibi date_format eklemek için tartışma var (ki bunu görmüştünüz). Yine de yükseltmenizi tavsiye ederim.
Andy Hayden

benim sorunum tarihim bu formatta ... 41516.43 ve bu hatayı alıyorum. Yeni sütunda 2014-02-03 gibi bir şey döndürmesini bekliyorum ?! HATA: "load_date" sütunundaki tarih değerlerini, budget_dataset ['date_last_load'] = pd.to_datetime (budget_dataset ['load_date']) budget_dataset -c: 2: SettingWithCopyWarning: Bir değer bir üzerinde ayarlanmaya çalışılıyor DataFrame'den bir dilim kopyası. Onun yerine .loc [row_index, col_indexer] = değer kullanmayı deneyin
yoshiserry

37

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


Teşekkürler, tam da ihtiyacım olan buydu. Dokümantasyon taşındı, ancak burada bulabilirsiniz: pandas.pydata.org/pandas-docs/stable/reference/api/…
Sastibe

24

Ş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.


2
Bu benim için çalışmıyor, şikayet ediyor: Sadece .dt erişimcisini datetimelike değerleriyle kullanabilir
smishra

2
df[col] = pd.to_datetime(df[col])önce sütununuzu tarih saat nesnelerine dönüştürmek için yapmanız gerekebilir .
szeitlin

1
Bu yanıtla ilgili sorun , pandalarda dtype = objectolduğundan çok daha fazla bellek alan sütunu dönüştürmesidir datetime dtype.
elPastor


6

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)

Soru tarih soruyor, tarih değil.
Mark Andersen

@MarkAndersen 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 objectdtype elde edersiniz; bellek yönetiminde kayıp.
Sumanth Lazarus

1

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

0

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


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

Tamlık adına, en basit seçenek olmayabilir, @SSS tarafından önerilene biraz benzer, ancak daha çok datetime kitaplığını kullanan başka bir seçenek şudur:

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.