Kết hợp các cột Ngày và Giờ bằng cách sử dụng pandas python


113

Tôi có một khung dữ liệu gấu trúc với các cột sau;

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

Làm cách nào để kết hợp dữ liệu ['Ngày tháng'] và dữ liệu ['Thời gian'] để có được dữ liệu sau? Có một cách để làm điều đó bằng cách sử dụng 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

Cảm ơn tất cả các câu trả lời. Tôi đã thử hầu hết trong số chúng nhưng vẫn còn khi tôi thêm thông tin ngày giờ này như một phần của khung dữ liệu lớn hơn. Cột ngày giờ chỉ hiển thị ngày và thông tin thời gian không hiển thị. Chúng ta nên hiểu rằng thời gian bị ẩn ở đó hay bị loại bỏ?
karthikeyan

Câu trả lời:


169

Điều đáng nói là bạn có thể đọc trực tiếp điều này, ví dụ: nếu bạn đang sử read_csvdụng bằng cách sử dụng parse_dates=[['Date', 'Time']].

Giả sử đây chỉ là các chuỗi, bạn có thể chỉ cần thêm chúng lại với nhau (với khoảng trắng), cho phép bạn áp dụng 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]

Lưu ý: đáng ngạc nhiên (đối với tôi), điều này hoạt động tốt với NaN được chuyển đổi thành NaT, nhưng điều đáng lo ngại là việc chuyển đổi (có thể sử dụng raiseđối số).


6
Không biết về tính năng kết hợp tự động, và nó hoạt động với nhiều mục quá, như: parse_dates=[['Start date', 'Start time'], ['End date', 'End time']]). Gấu trúc <3
5agado

43

Câu trả lời được chấp nhận phù hợp với các cột có kiểu dữ liệu string. Về tính đầy đủ: Tôi gặp câu hỏi này khi tìm kiếm cách thực hiện việc này khi các cột có kiểu dữ liệu: ngày và giờ.

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

2
Tôi không thể tìm thấy bất cứ điều gì liên quan đến timedtype, trong gấu trúc. Tôi có đúng hơn là một timedelta(và a datetime) trong trường hợp đó bạn chỉ cần thêm chúng vào, hãy xem câu trả lời của tôi
toto_tico

Khi tôi 'pd.read_excel' một cột Excel mà Excel xác định là "Thời gian", gấu trúc cũng tự động đọc nó là "Thời gian" mà không cần bất kỳ đối số phân tích cú pháp nào. Cảm ơn cho giải pháp này. +1
Saeed

1
Chỉ cần lưu ý, kể từ pandas 1.0.0 pd.datetime đã không được dùng nữa và bạn nên chỉ nhập datetimemô-đun một cách rõ ràng để thay thế.
CopOnTheRun

16

Bạn có thể sử dụng điều này để hợp nhất ngày và giờ vào cùng một cột của khung dữ liệu.

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

Đọc tệp .csv với các cột được hợp nhất Date_Time:

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

Bạn có thể sử dụng dòng này để giữ cả các cột khác.

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

1
Bạn cũng có thể sử dụng tùy chỉnh date_parser, ví dụparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

Bạn có thể ép kiểu các cột nếu các kiểu khác nhau (datetime và timestamp hoặc str) và sử dụng to_datetime:

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

Kết quả :

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

Tốt,


10

Tôi không có đủ danh tiếng để bình luận về jka.ne vì vậy:

Tôi đã phải sửa đổi dòng jka.ne để nó hoạt động:

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

Điều này có thể giúp những người khác.

Ngoài ra, tôi đã thử nghiệm một cách tiếp cận khác, sử dụng replacethay vì 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)

trong trường hợp của OP sẽ là:

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

Tôi đã tính thời gian cho cả hai phương pháp tiếp cận cho tập dữ liệu tương đối lớn (> 500.000 hàng) và cả hai đều có thời gian chạy tương tự nhau, nhưng sử dụng combinenhanh hơn (59 giây replaceso với 50 giây combine).


5

Câu trả lời thực sự phụ thuộc vào loại cột của bạn là gì . Trong trường hợp của tôi, tôi đã có datetimetimedelta.

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

Nếu đây là trường hợp của bạn, thì bạn chỉ cần thêm các cột:

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

Câu trả lời được chấp nhận giả định là các chuỗi: "Giả sử đây chỉ là các chuỗi, bạn có thể chỉ cần thêm chúng lại với nhau (với khoảng trắng)" . Câu trả lời của tôi dành cho datetimetimedelta. Câu trả lời chính bằng cách nào đó tìm ra rằng các cột là chuỗi, hoặc có thể đó chỉ là câu trả lời phù hợp với cột đã đăng câu hỏi.
toto_tico

4

Bạn cũng có thể chuyển đổi thành datetimemà không cần nối chuỗi, bằng cách kết hợp datetimetimedeltacác đối tượng. Kết hợp với pd.DataFrame.pop, bạn có thể xóa chuỗi nguồn đồng thời:

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
Giải pháp chung tuyệt vời! Tôi đã gõ datetime date và gõ str time và điều này đã hoạt động.
sparrow

3

Trước tiên, hãy đảm bảo có đúng kiểu dữ liệu:

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

Sau đó, bạn dễ dàng kết hợp chúng:

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

2

Sử dụng combinechức năng:

datetime.datetime.combine(date, time)

2

Tập dữ liệu của tôi có dữ liệu độ phân giải 1 giây trong vài ngày và việc phân tích cú pháp theo các phương pháp được đề xuất ở đây rất chậm. Thay vào đó tôi đã sử dụng:

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

Lưu ý rằng việc sử dụng cache=Truelàm cho phân tích cú pháp ngày rất hiệu quả vì chỉ có một vài ngày duy nhất trong tệp của tôi, điều này không đúng với cột ngày và giờ kết hợp.


Đây là những gì tôi sẽ làm.
Yaakov Bressler

1

DỮ LIỆU:

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

MÃ:

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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.