Pandas.to_datetime kullanırken yalnızca tarih bölümünü saklayın


206

pandas.to_datetimeVerilerimdeki tarihleri ​​ayrıştırmak için kullanıyorum . Pandalar datetime64[ns], tarihlerin tümü yalnızca günlük olmasına rağmen varsayılan olarak tarihleri ​​temsil eder . Ben için tarihleri dönüştürmek için zarif / akıllı yolu olup olmadığını merak datetime.dateya datetime64[D]ben CSV veri yazma zaman, tarihler de eklenmeli edilmez, böylece 00:00:00. El ile eleman eleman eleman dönüştürebilirsiniz biliyorum:

[dt.to_datetime().date() for dt in df.dates]

Ama bu çok yavaş çünkü birçok satırım var ve kullanım amacını bir çeşit yenilgiye uğratıyor pandas.to_datetime. Bir dtypekerede tüm sütunu dönüştürmenin bir yolu var mı ? Veya alternatif olarak, pandas.to_datetimegünlük verilerle çalışırken zaman kısmından kurtulabilmem için hassas bir spesifikasyonu destekliyor mu?

Yanıtlar:


295

Sürüm olduğundan 0.15.0, artık .dtyalnızca tarih bileşenine erişmek için kolayca yapılabilir :

df['just_date'] = df['dates'].dt.date

Yukarıdaki bir datetime.datedtype döndürür , eğer bir sahip olmak istiyorsanız , zaman bileşenini gece yarısına kadar datetime64yapabilirsiniz normalize, böylece tüm değerleri şu şekilde ayarlar 00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()

Bu dtype değerini korur datetime64ancak ekranda sadece datedeğer gösterilir.


37

Basit Çözüm:

df['date_only'] = df['date_time_column'].dt.date

Sadece bir uyarı, bu tür nesneyi değiştirir. Bu nedenle tutarlılığı korumak için astype ('datetime64') yazmanız gerekir.
misantroop

26

OP'nin sorusuna en doğrudan cevap olan EdChum'un cevabını iptal etsem de, performans problemini gerçekten çözmüyor (hala python datetimenesnelerine dayanıyor ve bu yüzden üzerlerindeki herhangi bir işlem vektörleştirilmeyecek - yani, yavaş olacaktır).

Daha iyi performans gösteren bir alternatif kullanmaktır df['dates'].dt.floor('d'). Açıkçası, sadece tarih kısmını tutmaz, çünkü sadece zamanı ayarlar 00:00:00. Ancak aşağıdaki durumlarda OP tarafından istendiği gibi çalışır:

  • ekrana baskı
  • csv'ye kaydetme
  • sütununu kullanarak groupby

... ve operasyon vektörleştirildiğinden çok daha verimlidir.

DÜZENLEME: aslında, OP en tercih ederdik cevabı muhtemelen "son sürümlerini olduğunu pandasdo not Çünkü eğer csv için zaman yazma 00:00:00tüm gözlemler için".


Ne yazık ki to_jsonhala tam yazıyor 00:00:00.
IanS

Kullanırken @IanS demek istiyorsun date_format='iso'?! Varsayılan olarak, çağdan bu yana sadece saniyeler çıkar.
Pietro Battiston

Evet, demek istediğim buydu.
IanS

Bu, dt.normalize()birkaç yüz unsurdan daha uzun serilerde daha hızlıdır.
C8H10N4O2

17

Pandalar DatetimeIndexve tam olarak ne istediğinizi yapan Seriesbir yöntem var normalize.

Bu cevapta daha fazla bilgi bulabilirsiniz .

Olarak kullanılabilir ser.dt.normalize()


17

Pandas v0.13 +: Parametre to_csvile kullanındate_format

Kaçının, mümkünse sizin dönüştürme datetime64[ns]bir seriyi objectait d_type dizi datetime.datenesneler. İkincisi, çoğunlukla kullanılarak inşa pd.Series.dt.dateedilir, bir işaretçiler dizisi olarak saklanır ve saf bir NumPy tabanlı seriye göre verimsizdir.

CSV'ye yazarken endişeniz format olduğundan , date_formatparametresini kullanın to_csv. Örneğin:

df.to_csv(filename, date_format='%Y-%m-%d')

Kuralları biçimlendirmek için Python strftimeyönergelerine bakın .


8

Bu, tarihi ayıklamanın basit bir yoludur:

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)

OP zaten sorularında .date () yöntemini kullanıyor, bu nedenle bu çözüm sorularına cevap vermiyor, ancak date () yöntemini sadece referans olarak kullanmanın basit bir örneğini görmeyi yararlı buldum.
Nic Scozzaro

5

Şuraya dönüştürülüyor datetime64[D]:

df.dates.values.astype('M8[D]')

Yine de bunu bir DataFrame sütununa yeniden atamak [ns] 'a geri döndürecektir.

Gerçek istiyorsanız datetime.date:

dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])

3
Eğer astype ('M8 [D]') kullanıyorsanız, eksik değerleri başlangıç ​​tarihi olan 1970-1-1'e dönüştürür. Muhtemelen bugünlerde pandas.to_datetime () kullanmak daha iyidir.
Stewbaca

1
Datetime modülünü rutin olarak içeren herkese dikkat edin dt, bu cevap pasajı bu modülün üzerine yazacaktır! @ Dale-Jung, belki de hattı dt_index gibi bir şeye değiştirebilir
yeliabsalohcin

Ayrıca bir dahaki sefere df.loc[date]yöntemle yeni bir satır eklemek ve eklemek için bir sorun buluyorum , dizin zaman damgasına geri döner, yani sonraki karşılaştırmalar artık işe yaramaz
yeliabsalohcin

3

Birisinin bu eski postayı görmesi durumunda daha güncel bir cevap vermek.

Tarih saatine dönüştürürken "utc = False" eklendiğinde, saat dilimi bileşeni kaldırılacak ve tarih datetime64 [ns] veri türünde tutulacaktır.

pd.to_datetime(df['Date'], utc=False)

"ValueError: Excel zaman dilimleri ile dat zamanları desteklemiyor. Lütfen Excel'e yazmadan önce dat zamanlarının habersiz olduğundan emin olun.

resim açıklamasını buraya girin


Sütunla herhangi bir toplama işlevi uyguladıktan sonra bu nedenle başarısız olur.
RaphX

0

Bir veri çerçevesindeki bir sütun kümesi için türü değiştirmek ve sonra gün tutmak zaman kaldırmak istedim. yuvarlak (), kat (), tavan () tüm işler

df[date_columns] = df[date_columns].apply(pd.to_datetime)
df[date_columns] = df[date_columns].apply(lambda t: t.dt.floor('d'))
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.