अजगर पंडों का उपयोग करके दिनांक और समय कॉलम मिलाएं


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

सारे सवालों के जवाब देने के लिए धन्यवाद। मैंने उनमें से अधिकांश की कोशिश की है, लेकिन फिर भी जब मैं इस डेटाटाइम जानकारी को एक बड़ी डेटाफ़्रेम के हिस्से के रूप में जोड़ता हूं। डेटाइम कॉलम केवल तारीख और समय की जानकारी प्रदर्शित नहीं करता है। क्या हमें यह समझना चाहिए कि समय वहां छिपा है या इसे हटा दिया गया है?
कार्तिकेयन

जवाबों:


169

यह ध्यान देने योग्य है कि आप इसे सीधे पढ़ने में सक्षम हो सकते हैं जैसे यदि आप उपयोग read_csvकर रहे थे parse_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']]):।
पंडस

43

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

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

2
मुझे timedtype के बारे में , पांडा में कुछ भी नहीं मिल रहा है । मेरे पास एक timedelta(और datetime) है जिस स्थिति में आपको बस उन्हें जोड़ने की जरूरत है, मेरा उत्तर देखें
toto_tico

जब मैं एक्सेल कॉलम को 'pd.read_excel' करता हूं, जिसे एक्सेल "टाइम" के रूप में पहचानता है, तो पंडों को भी बिना किसी पार्स तर्क के "स्वचालित रूप से" टाइम के रूप में पढ़ना पड़ता है। इस समाधान के लिए धन्यवाद। +1
सईद

1
बस एक नोट, जैसा कि पंडों 1.0.0 pd.datetime को चित्रित किया गया है और इसके datetimeबजाय मॉड्यूल को स्पष्ट रूप से आयात करने का सुझाव दिया गया है ।
कोपोनियन रॉन

16

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

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

यदि कॉलम अलग हैं (डाइमटाइम और टाइमस्टैम्प या 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)

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

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

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


5

उत्तर वास्तव में इस बात पर निर्भर करता है कि आपके स्तंभ प्रकार क्या हैं । मेरे मामले में, मैं था datetimeऔर timedelta

> 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
महान सामान्य समाधान! मेरे पास टाइप डेटटाइम और टाइप स्ट्रेट टाइम था और यह काम करता था।
गौरैया

3

पहले सही डेटा प्रकार सुनिश्चित करें:

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

फिर आप उन्हें आसानी से संयोजित करते हैं:

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


2

मेरे डेटासेट में कुछ दिनों के लिए 1second रिज़ॉल्यूशन डेटा था और यहाँ सुझाए गए तरीकों से पार्स करना बहुत धीमा था। इसके बजाय मैंने इस्तेमाल किया:

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

नोट बनाने की cache=Trueतारीखों के उपयोग को नोट करें, क्योंकि मेरी फ़ाइलों में कुछ ही अद्वितीय तारीखें हैं, जो कि एक संयुक्त तिथि और समय कॉलम के लिए सही नहीं है।


क्या यही मुझे करना होगा।
याकोव ब्रेसलर

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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.