Python pandaları kullanarak Tarih ve Saat sütunlarını birleştirin


113

Aşağıdaki sütunlara sahip bir panda veri çerçevem ​​var;

Date              Time
01-06-2013      23:00:00
02-06-2013      01:00:00
02-06-2013      21:00:00
02-06-2013      22:00:00
02-06-2013      23:00:00
03-06-2013      01:00:00
03-06-2013      21:00:00
03-06-2013      22:00:00
03-06-2013      23:00:00
04-06-2013      01:00:00

Aşağıdakileri elde etmek için verileri ['Tarih'] ve verileri ['Saat'] nasıl birleştiririm? Kullanmanın bir yolu var mı pd.to_datetime?

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

Tüm cevaplar için teşekkürler. Birçoğunu denedim ama yine de bu tarih saat bilgisini daha büyük bir veri çerçevesinin parçası olarak eklediğimde. Tarih ve saat sütunu yalnızca tarihi gösterir ve saat bilgisi görüntülenmez. Zamanın orada saklı olduğunu anlamalı mıyız yoksa kaldırılmış mı?
karthikeyan

Yanıtlar:


169

Eğer bu okumak mümkün olabileceğini belirterek 's değerinde doğrudan kullandığınız takdirde, örneğin read_csvkullanarak parse_dates=[['Date', 'Time']].

Bunların sadece dizeler olduğunu varsayarsak, onları basitçe (boşlukla) ekleyebilir ve uygulamanıza izin verebilirsiniz to_datetime:

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]

Not: şaşırtıcı bir şekilde (benim için), bu NaN'lerin NaT'ye dönüştürülmesiyle iyi çalışıyor, ancak dönüşümün (belki de raiseargümanı kullanarak ) endişelenmeye değer .


6
Otomatik kombinasyon özelliği hakkında biliyorum ve bu gibi çok çoklu girişler ile çalışır mı: parse_dates=[['Start date', 'Start time'], ['End date', 'End time']]). Pandalar <3
5agado

43

Kabul edilen yanıt, veri türündeki sütunlar için geçerlidir string. Tamlık için: Sütunlar veri türü olduğunda, bunun nasıl yapılacağını ararken bu soruyla karşılaşıyorum: tarih ve saat.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

2
timePandalarda dtype ile ilgili hiçbir şey bulamıyorum . Bende daha çok a timedelta(ve a datetime) var, bu durumda onları eklemeniz gerekiyor,
cevabıma

Excel'in "Zaman" olarak tanımladığı bir Excel sütununu 'pd.read_excel' yaptığımda, pandalar bunu herhangi bir ayrıştırma argümanı gerekmeden otomatik olarak "Zaman" olarak da okur. Bu çözüm için teşekkürler. +1
Saeed

1
Sadece bir not, pandas 1.0.0'dan pd.datetime itibaren kullanımdan kaldırıldı ve bunun datetimeyerine modülü açıkça içe aktarmanız önerilir .
CopOnTheRun

17

Tarih ve saati aynı veri çerçevesi sütununda birleştirmek için bunu kullanabilirsiniz.

import pandas as pd    
data_file = 'data.csv' #path of your file

Birleştirilmiş sütunlarla Date_Time .csv dosyası okunuyor:

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

Bu satırı diğer iki sütunu da tutmak için kullanabilirsiniz.

data.set_index(['Date', 'Time'], drop=False)

1
Ayrıca özel kullanabilirsiniz date_parser, örneğinparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

Türler farklıysa (tarih saat ve zaman damgası veya str) sütunları çevirebilir ve to_datetime kullanabilirsiniz:

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

Sonuç:

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00

En iyi,


10

Jka.ne hakkında yorum yapacak kadar itibarım yok :

Çalışması için jka.ne'nin satırını değiştirmek zorunda kaldım :

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

Bu başkalarına yardımcı olabilir.

Ayrıca, ben kullanarak, farklı bir yaklaşım test ettik replaceyerine combine:

def combine_date_time(df, datecol, timecol):
    return df.apply(lambda row: row[datecol].replace(
                                hour=row[timecol].hour,
                                minute=row[timecol].minute),
                    axis=1)

OP durumunda bu şu şekilde olacaktır:

combine_date_time(df, 'Date', 'Time')

Nispeten büyük bir veri kümesi için her iki yaklaşımı da zamanladım (> 500.000 satır) ve her ikisinin de benzer çalışma zamanları var, ancak combinekullanımı daha hızlı ( replace50s için 59s, 50s için combine).


5

Cevap gerçekten sütun türlerinizin ne olduğuna bağlıdır . Benim durumumda datetimeve vardı timedelta.

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]

Durumunuz buysa, yalnızca sütunları eklemeniz gerekir:

> df['Date'] + df['Time']

Kabul edilen yanıt dizeleri varsayar: "Bunların yalnızca dizeler olduğunu varsayarsak, bunları bir araya (boşlukla) ekleyebilirsiniz" . Cevaplarım datetimeve için timedelta. Ana cevap bir şekilde sütunların dizeler olduğunu veya belki de soruyu gönderen için işe yarayan cevap olduğunu anladı.
toto_tico

4

Ayrıca datetime, datetimeve timedeltanesneleri birleştirerek dize birleştirme olmadan da dönüştürebilirsiniz . İle birleştirildiğinde pd.DataFrame.pop, kaynak seriyi aynı anda kaldırabilirsiniz:

df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))

print(df)

             DateTime
0 2013-01-06 23:00:00
1 2013-02-06 01:00:00
2 2013-02-06 21:00:00
3 2013-02-06 22:00:00
4 2013-02-06 23:00:00
5 2013-03-06 01:00:00
6 2013-03-06 21:00:00
7 2013-03-06 22:00:00
8 2013-03-06 23:00:00
9 2013-04-06 01:00:00

print(df.dtypes)

DateTime    datetime64[ns]
dtype: object

1
Harika genel çözüm! Tarih saat tarih yazdım ve str saati yazdım ve bu işe yaradı.
serçe

3

Öncelikle doğru veri türlerine sahip olduğunuzdan emin olun:

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])

Sonra bunları kolayca birleştirirsiniz:

df["DateTime"] = df["Date"] + df["Time"]

2

Şu combineişlevi kullanın :

datetime.datetime.combine(date, time)

2

Veri kümemde birkaç gün için 1 saniye çözünürlük verisi vardı ve burada önerilen yöntemlerle ayrıştırma çok yavaştı. Bunun yerine kullandım:

dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes  = dates + times

Kullanımına dikkat cache=Truekombine tarih ve saat sütunu için doğru değildir benim dosyaları içinde yalnızca birkaç benzersiz tarihleri olmadığından çok verimli tarihleri ayrıştırma yapar.


Ben bunu yapardım.
Yaakov Bressler

1

VERİ:

<TICKER>, <PER>, <DATE>, <TIME> , <OPEN>, <HIGH>, <LOW>, <CLOSE>, <VOL> SPFB.RTS, 1, 20190103,100100 , 106580.0000000,107260.0000000,106570.0000000 , 107230.0000000.3726

KOD:

data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
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.