2013-07-31 8 views
40

का उपयोग कर दिनांक और समय कॉलम को संयोजित करें मेरे पास निम्नलिखित कॉलम के साथ एक पांडा डेटाफ्रेम है;पाइथन पांडा

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 
+0

कॉलम के प्रकार क्या हैं? – mattexx

उत्तर

74

यह उल्लेख के लायक है कि आप सीधे उदा में यह पढ़ने में सक्षम हो सकता है है यदि आप parse_dates=[['Date', 'Time']] का उपयोग कर read_csv का उपयोग कर रहे थे।

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] 

नोट:: (मेरे लिए) आश्चर्यजनक रूप से, इस Nans परिवर्तित किया जा रहा के साथ ठीक काम करता है

मान लिया जाये कि ये सिर्फ रहे हैं तो आप बस उन्हें एक साथ (एक स्थान के साथ) जोड़ सकते हैं, तो आप to_datetime लागू करने के लिए अनुमति देता है तार NaT के लिए, लेकिन यह चिंताजनक है कि रूपांतरण (शायद raise तर्क का उपयोग कर)।

+0

शांत! यहां भी अच्छी तरह से काम करता है।'Coerce = True' – richie

+3

' parse_dates' विकल्प बहुत आसान नहीं है – onewhaleid

+0

स्वचालित संयोजन सुविधा के बारे में नहीं पता था, और यह कई प्रविष्टियों के साथ भी काम करता है, जैसे: 'parse_dates = [['प्रारंभ दिनांक' , 'स्टार्ट टाइम'], ['एंड डेट', 'एंड टाइम']])। पांडस <3 – 5agado

16

स्वीकार्य उत्तर डेटाटाइप string के कॉलम के लिए काम करता है। पूर्णता के लिए: जब कॉलम डेटाटाइप के होते हैं तो यह कैसे करें जब मैं यह प्रश्न पूछता हूं: दिनांक और समय।

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

मैं jka.ne इतने पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है:

मैं jka.ne's line संशोधन करने के लिए यह काम करने के लिए किया था:

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) 

जो ओ पी के मामले में होगा:

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

मैं समय समाप्त हो गया दोनों एक अपेक्षाकृत बड़े के लिए दृष्टिकोण है डेटासेट (> 500.000 पंक्तियां), और दोनों के पास समान रनटाइम हैं, लेकिन combine का उपयोग तेजी से है (replace बनाम 50s combine के लिए 50s)।

4

आप डेटाफ्रेम के उसी कॉलम में दिनांक और समय को मर्ज करने के लिए इसका उपयोग कर सकते हैं।

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

पढ़ना मर्ज किए गए कॉलम DATE_TIME साथ फ़ाइल .csv:

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

आप दोनों अन्य कॉलम भी रखने के लिए इस लाइन का उपयोग कर सकते हैं।

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

आप कस्टम 'date_parser' का भी उपयोग कर सकते हैं, उदाहरण के लिए 'parser = lambda दिनांक: pd.datetime.strptime (दिनांक,'% d-% b-% y% एच:% एम:% एस ')' – Serendipity