Gabungkan kolom Tanggal dan Waktu menggunakan python pandas

113

Saya memiliki kerangka data panda dengan kolom berikut;

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

Bagaimana cara menggabungkan data ['Date'] & data ['Time'] untuk mendapatkan yang berikut ini? Apakah ada cara untuk melakukannya dengan menggunakan 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
richie
sumber
Terima kasih atas semua jawabannya. Saya telah mencoba sebagian besar dari mereka tetapi tetap ketika saya menambahkan informasi datetime ini sebagai bagian dari kerangka data yang lebih besar. Kolom datetime hanya menampilkan tanggal dan informasi waktu tidak ditampilkan. Haruskah kita memahami bahwa waktu tersembunyi di sana atau dihapus?
karthikeyan

Jawaban:

169

Perlu disebutkan bahwa Anda mungkin dapat membaca ini secara langsung, misalnya jika Anda menggunakan read_csvmenggunakan parse_dates=[['Date', 'Time']].

Dengan asumsi ini hanya string, Anda dapat menambahkannya bersama-sama (dengan spasi), memungkinkan Anda untuk menerapkan 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]

Catatan: yang mengejutkan (bagi saya), ini berfungsi dengan baik dengan NaN yang diubah menjadi NaT, tetapi perlu dikhawatirkan bahwa konversi tersebut (mungkin menggunakan raiseargumen).

Andy Hayden
sumber
6
Tidak tahu tentang fitur kombinasi otomatis, dan bekerja dengan beberapa entri juga, seperti: parse_dates=[['Start date', 'Start time'], ['End date', 'End time']]). Panda <3
5agado
43

Jawaban yang diterima berfungsi untuk kolom yang merupakan tipe data string. Untuk kelengkapan: Saya menemukan pertanyaan ini ketika mencari bagaimana melakukan ini ketika kolomnya adalah tipe data: tanggal dan waktu.

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)
jka.ne
sumber
2
Saya tidak dapat menemukan apa pun tentang timedtype, di panda. Saya memiliki lebih banyak a timedelta(dan a datetime) dalam hal ini Anda hanya perlu menambahkannya, lihat jawaban saya
toto_tico
Ketika saya 'pd.read_excel' kolom Excel yang diidentifikasi Excel sebagai "Waktu", panda juga membacanya sebagai "Waktu" secara otomatis tanpa memerlukan argumen parsing. Terima kasih untuk solusi ini. +1
Saeed
1
Sekadar catatan, pandas 1.0.0 pd.datetime sudah tidak digunakan lagi dan disarankan untuk mengimpor datetimemodul secara eksplisit saja.
CopOnTheRun
16

Anda dapat menggunakan ini untuk menggabungkan tanggal dan waktu ke dalam kolom dataframe yang sama.

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

Membaca file .csv dengan kolom gabungan Date_Time:

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

Anda juga dapat menggunakan baris ini untuk mempertahankan kedua kolom lainnya.

data.set_index(['Date', 'Time'], drop=False)
MK Rana
sumber
1
Anda juga dapat menggunakan kustom date_parser, misalnyaparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity
11

Anda dapat mentransmisikan kolom jika tipenya berbeda (datetime dan timestamp atau str) dan menggunakan to_datetime:

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

Hasil:

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

Terbaik,

Chris PERE
sumber
10

Saya tidak memiliki reputasi yang cukup untuk mengomentari jka.ne jadi:

Saya harus mengubah baris jka.ne agar berfungsi:

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

Ini mungkin membantu orang lain.

Juga, saya telah menguji pendekatan yang berbeda, menggunakan replacealih-alih 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)

yang dalam kasus OP adalah:

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

Saya telah menghitung waktu kedua pendekatan untuk kumpulan data yang relatif besar (> 500.000 baris), dan keduanya memiliki waktu proses yang serupa, tetapi menggunakan combinelebih cepat (59 detik untuk replacevs 50 detik untuk combine).

jabellcu.dll
sumber
5

Jawabannya sangat tergantung pada jenis kolom Anda . Dalam kasus saya, saya pernah datetimedan timedelta.

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

Jika ini kasus Anda, Anda hanya perlu menambahkan kolom:

> df['Date'] + df['Time']
toto_tico
sumber
Jawaban yang diterima mengasumsikan string: "Dengan asumsi ini hanya string, Anda dapat menambahkannya bersama-sama (dengan spasi)" . Jawaban saya adalah untuk datetimedan timedelta. Jawaban utama entah bagaimana mengetahui bahwa kolomnya adalah string, atau mungkin hanya jawaban yang berhasil untuk pertanyaan yang diposting.
toto_tico
4

Anda juga dapat mengonversi menjadi datetimetanpa penggabungan string, dengan menggabungkan objek datetimedan timedelta. Dikombinasikan dengan pd.DataFrame.pop, Anda dapat menghapus rangkaian sumber secara bersamaan:

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
jpp
sumber
1
Solusi umum yang bagus! Saya memiliki tanggal jenis tanggal dan waktu jenis str dan ini berhasil.
burung gereja
3

Pertama, pastikan Anda memiliki tipe data yang benar:

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

Kemudian Anda dengan mudah menggabungkannya:

df["DateTime"] = df["Date"] + df["Time"]
antrian
sumber
2

Gunakan combinefungsi:

datetime.datetime.combine(date, time)
Stephen
sumber
2

Dataset saya memiliki data resolusi 1 detik selama beberapa hari dan penguraian dengan metode yang disarankan di sini sangat lambat. Sebagai gantinya saya menggunakan:

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

Perhatikan penggunaan cache=Truemembuat parsing tanggal sangat efisien karena hanya ada beberapa tanggal unik di file saya, yang tidak berlaku untuk kolom tanggal dan waktu gabungan.

tgbrooks.dll
sumber
Inilah yang akan saya lakukan.
Yaakov Bressler
1

DATA:

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

KODE:

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')
hacknull
sumber