DataFrame पांडा में तिथियों के बीच दिनों की संख्या के साथ कॉलम जोड़ें


101

मैं 'ए' में तारीखों को 'बी' में तारीखों से घटाना चाहता हूं और अंतर के साथ एक नया कॉलम जोड़ना चाहता हूं।

df
          A        B
one 2014-01-01  2014-02-28 
two 2014-02-03  2014-03-01

मैंने निम्नलिखित कोशिश की है, लेकिन एक त्रुटि मिलती है जब मैं इसे लूप में शामिल करने की कोशिश करता हूं ...

import datetime
date1=df['A'][0]
date2=df['B'][0]
mdate1 = datetime.datetime.strptime(date1, "%Y-%m-%d").date()
rdate1 = datetime.datetime.strptime(date2, "%Y-%m-%d").date()
delta =  (mdate1 - rdate1).days
print delta

मुझे क्या करना चाहिए?

जवाबों:


100

मान लें कि ये डेटाटाइम कॉलम थे (यदि वे लागू नहीं हैं to_datetime) तो आप उन्हें घटा सकते हैं:

df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])

In [11]: df.dtypes  # if already datetime64 you don't need to use to_datetime
Out[11]:
A    datetime64[ns]
B    datetime64[ns]
dtype: object

In [12]: df['A'] - df['B']
Out[12]:
one   -58 days
two   -26 days
dtype: timedelta64[ns]

In [13]: df['C'] = df['A'] - df['B']

In [14]: df
Out[14]:
             A          B        C
one 2014-01-01 2014-02-28 -58 days
two 2014-02-03 2014-03-01 -26 days

नोट: सुनिश्चित करें कि आप एक नया पांडा (जैसे 0.13.1) का उपयोग कर रहे हैं, यह पुराने संस्करणों में काम नहीं कर सकता है।


24
क्या हम परिणाम के भाग में "दिनों" वाले हिस्से से छुटकारा पा सकते हैं हमें सिर्फ संख्यात्मक मूल्य यानी देखने की जरूरत है। -58, -26 इस मामले में।
नं।

6
@AndyHayden टिप्पणी पर विस्तार करने के लिए, वह काम करता है लेकिन यह pd.offsets.Day(1)('s' के साथ) होना चाहिए । मैं भी आम तौर पर यह, नकारना ताकि आप(df['A'] - df['B']) / pd.offsets.Day(-1)
dirkjot

12
हालाँकि, यदि आप इसे पूरी श्रृंखला पर करना चाहते हैं तो आपको ऐसे (df['A'] - df['B']) / np.timedelta64(-1, 'D')कारणों की आवश्यकता है जो मुझे पूरी तरह से समझ में नहीं आते हैं।
dirkjot

@dirkjot टाइपो को स्पॉट करने के लिए धन्यवाद! IIRC यह हाल के पांडा में तय था, क्या आप 0.16.2 / 0.17 का उपयोग कर रहे हैं?
एंडी हेडन

2
@webelo डाटटाइमइंडेक्स / सीरीज में स्वयं एक .dt.daysविशेषता होनी चाहिए जिसे दृढ़ता से पसंद किया जाना चाहिए।
एंडी हेडन

109

'दिनों' पाठ तत्व को निकालने के लिए, आप श्रृंखला के लिए dt () एक्सेसर का उपयोग भी कर सकते हैं: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.html

इसलिए,

df[['A','B']] = df[['A','B']].apply(pd.to_datetime) #if conversion required
df['C'] = (df['B'] - df['A']).dt.days

कौन सा रिटर्न:

             A          B   C
one 2014-01-01 2014-02-28  58
two 2014-02-03 2014-03-01  26

3
बहुत बढ़िया जवाब। मेरे मामले में, df['C'] = (df['B'] - df['A']).dt.daysकाम नहीं किया और मुझे उपयोग करना पड़ा df['C'] = (df['B'] - df['A']).days। किसी भी विचार क्यों मेरी उम्मीद के अनुसार दिनों की संख्या नहीं दी?
शमूएल नाडे

Nde - वास्तव में यह कैसे काम नहीं किया? त्रुटि या गलत मूल्य? क्या आपने A और B दोनों कॉलम को सफलतापूर्वक डेटटाइम में बदल दिया है?
रिकी मैकमास्टर

1
मेरे दोनों कॉलम डेटाइम (या datetime64[ns]सटीक होने के लिए) हैं। जब मैंने किया df['C'] = (df['B'] - df['A']).dt.days, तो मुझे एक विशेषता त्रुटि मिली, जिसमें कहा गया है कि गुण: 'Timedelta' ऑब्जेक्ट में कोई विशेषता 'dt' नहीं है , इसलिए मैंने df ['C'] = (df ['B'] - df ['a']) की कोशिश की। दिनों जो मुझे वांछित जवाब दिया। (निश्चित रूप से मैं अपने स्वयं के डेटाफ्रेम का उपयोग ऊपर के उदाहरण में नहीं कर रहा हूं। या ऐसा इसलिए हो सकता है क्योंकि मेरे पास अपनी तारीख में भी समय है और इस तरह नहीं है 2018-09-24 10:17:18.800277)
सैमुअल नेड

1
सही जवाब।
user3065757

1
महान समाधान। धन्यवाद!
रोड्रिगो हर्जॉर्ट

11

यह करने के लिए सबसे पायथोनिक (और सबसे तेज़) तरीके के लिए एक सूची समझदारी आपका सबसे अच्छा दांव है:

[int(i.days) for i in (df.B - df.A)]
  1. मैं समयसीमा वापस कर दूंगा (जैसे '-58 दिन')
  2. i। रविवार इस मान को लंबे पूर्णांक मान के रूप में लौटाएगा (उदाहरण -58L)
  3. int (i.days) आपको -58 की तलाश में आपको देगा।

यदि आपके कॉलम डेटाइम फॉर्मेट में नहीं हैं। छोटा सिंटैक्स होगा:df.A = pd.to_datetime(df.A)


1

इस बारे में कैसा है:

times['days_since'] = max(list(df.index.values))  
times['days_since'] = times['days_since'] - times['months']  
times
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.