รวมคอลัมน์วันที่และเวลาโดยใช้ python pandas


113

ฉันมีดาต้าเฟรมแพนด้าที่มีคอลัมน์ต่อไปนี้

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

ฉันจะรวมข้อมูล ['วันที่'] และข้อมูล ['เวลา'] เพื่อรับสิ่งต่อไปนี้ได้อย่างไร มีวิธีการทำโดยใช้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

ขอบคุณสำหรับคำตอบทั้งหมด ฉันได้ลองส่วนใหญ่แล้ว แต่เมื่อฉันเพิ่มข้อมูลวันที่และเวลานี้เป็นส่วนหนึ่งของดาต้าเฟรมที่ใหญ่กว่า คอลัมน์วันที่และเวลาแสดงเฉพาะวันที่และข้อมูลเวลาจะไม่แสดง เราควรเข้าใจว่าเวลาซ่อนอยู่ที่นั่นหรือถูกลบออกไป?
karthikeyan

คำตอบ:


169

มันมูลค่าการกล่าวขวัญว่าคุณอาจได้รับสามารถที่จะอ่านนี้โดยตรงเช่นถ้าคุณใช้การใช้read_csvparse_dates=[['Date', 'Time']]

สมมติว่าสิ่งเหล่านี้เป็นเพียงสตริงที่คุณสามารถเพิ่มเข้าด้วยกันได้ (โดยเว้นวรรค) ทำให้คุณสามารถใช้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]

หมายเหตุ: น่าแปลกใจ (สำหรับฉัน) สิ่งนี้ใช้ได้ดีกับ NaN ที่ถูกแปลงเป็น NaT แต่ก็น่ากังวลว่าการแปลง (อาจใช้raiseอาร์กิวเมนต์)


6
parse_dates=[['Start date', 'Start time'], ['End date', 'End time']])ไม่ทราบเกี่ยวกับคุณลักษณะการรวมกันโดยอัตโนมัติและจะทำงานร่วมกับรายการหลายรายการเกินไปเช่น: Pandas <3
5agado

43

stringคำตอบที่ได้รับการยอมรับการทำงานสำหรับคอลัมน์ที่มีประเภทข้อมูล เพื่อความสมบูรณ์: ฉันเจอคำถามนี้เมื่อค้นหาวิธีการทำเช่นนี้เมื่อคอลัมน์เป็นประเภทข้อมูล: วันที่และเวลา

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

2
ฉันไม่พบสิ่งใดเกี่ยวกับtimedtype ในหมีแพนด้า ฉันค่อนข้างมีtimedelta(และ a datetime) ซึ่งในกรณีนี้คุณต้องเพิ่มดูคำตอบของฉัน
toto_tico

เมื่อฉัน 'pd.read_excel' คอลัมน์ Excel ที่ Excel ระบุว่าเป็น "เวลา" แพนด้าจะอ่านว่า "เวลา" โดยอัตโนมัติโดยไม่ต้องมีอาร์กิวเมนต์แยกวิเคราะห์ใด ๆ ขอบคุณสำหรับการแก้ปัญหานี้ +1
Saeed

1
โปรดทราบว่าเนื่องจากแพนด้า 1.0.0 pd.datetime ได้เลิกใช้งานแล้วและขอแนะนำให้นำเข้าdatetimeโมดูลอย่างชัดเจนแทน
CopOnTheRun

17

คุณสามารถใช้สิ่งนี้เพื่อรวมวันที่และเวลาลงในคอลัมน์เดียวกันของ dataframe

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

การอ่านไฟล์. csv ที่มีคอลัมน์ที่ผสาน Date_Time:

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

คุณสามารถใช้บรรทัดนี้เพื่อเก็บคอลัมน์อื่น ๆ ไว้ด้วย

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

1
คุณยังสามารถใช้แบบกำหนดเองได้date_parserเช่นparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
Serendipity

11

คุณสามารถแคสต์คอลัมน์ได้หากประเภทต่างกัน (datetime และ timestamp หรือ str) และใช้ to_datetime:

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

ผลลัพธ์ :

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

ดีที่สุด


10

ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นเกี่ยวกับjka.neดังนั้น:

ฉันต้องแก้ไขบรรทัดของ jka.neเพื่อให้ใช้งานได้:

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

สิ่งนี้อาจช่วยคนอื่นได้

นอกจากนี้ฉันได้ทดสอบวิธีการอื่นโดยใช้replaceแทน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 จะเป็น:

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

ฉันได้กำหนดเวลาทั้งสองวิธีสำหรับชุดข้อมูลที่ค่อนข้างใหญ่แล้ว (> 500.000 แถว) และทั้งสองมีเวลาทำงานใกล้เคียงกัน แต่การใช้งานcombineเร็วกว่า (59 วินาทีสำหรับreplaceเทียบกับ 50 combineวินาทีสำหรับ)


5

คำตอบจริงๆขึ้นอยู่กับสิ่งที่ประเภทคอลัมน์ของคุณ ในกรณีของฉันฉันมีและdatetimetimedelta

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

หากเป็นกรณีของคุณคุณก็ต้องเพิ่มคอลัมน์:

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

คำตอบที่ได้รับการยอมรับถือว่าสตริง: "สมมติว่านี้จะมีเพียงเหล่านี้คุณก็สามารถเพิ่มพวกเขาร่วมกัน (มีช่องว่าง)" คำตอบของฉันมีการและdatetime timedeltaคำตอบหลักอย่างใดทำให้ทราบว่าคอลัมน์เป็นสตริงหรืออาจเป็นเพียงคำตอบที่ใช้ได้กับคำถามที่โพสต์
toto_tico

4

คุณยังสามารถแปลงเป็นdatetimeโดยไม่ต้องเชื่อมต่อสตริงโดยการรวมdatetimeและtimedeltaอ็อบเจ็กต์ เมื่อรวมกับpd.DataFrame.popคุณสามารถลบซีรีส์ต้นทางพร้อมกันได้:

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
วิธีแก้ปัญหาทั่วไปที่ยอดเยี่ยม! ฉันพิมพ์วันที่และเวลาและพิมพ์เวลา str และสิ่งนี้ได้ผล
sparrow

3

อันดับแรกตรวจสอบให้แน่ใจว่ามีประเภทข้อมูลที่ถูกต้อง:

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

จากนั้นคุณรวมเข้าด้วยกันได้อย่างง่ายดาย:

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


2

ชุดข้อมูลของฉันมีข้อมูลความละเอียด 1 วินาทีเป็นเวลาสองสามวันและการแยกวิเคราะห์ตามวิธีการที่แนะนำนี้ช้ามาก ฉันใช้:

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

โปรดสังเกตว่าการใช้การcache=Trueแยกวิเคราะห์วันที่มีประสิทธิภาพมากเนื่องจากมีวันที่ที่ไม่ซ้ำกันเพียงไม่กี่วันในไฟล์ของฉันซึ่งไม่เป็นความจริงสำหรับคอลัมน์วันที่และเวลารวมกัน


นี่คือสิ่งที่ฉันจะทำ
Yaakov Bressler

1

ข้อมูล:

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

รหัส:

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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.