ডেটাফ্রেম পান্ডসে তারিখের মধ্যে দিনের সংখ্যার সাথে কলাম যুক্ত করুন


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 এই ক্ষেত্রে।
0nir

6
@ অ্যান্ডহেডেন মন্তব্যে প্রসারিত করতে, এটি কাজ করে তবে এটি হওয়া উচিত pd.offsets.Day(1)(একটি 'এর' দিয়ে)। আমি সাধারণত এটি অস্বীকার করি, তাই আপনি পান(df['A'] - df['B']) / pd.offsets.Day(-1)
dirkjot

12
তবে আপনি যদি পুরো সিরিজে এটি করতে চান তবে আপনার প্রয়োজনীয় (df['A'] - df['B']) / np.timedelta64(-1, 'D')কারণগুলি যা আমি পুরোপুরি বুঝতে পারি না।
dirkjot

@ দিরকজোট টাইপকে স্পট করার জন্য ধন্যবাদ! আইআইআরসি সাম্প্রতিক পান্ডায় এটি ঠিক করা হয়েছিল, আপনি কি 0.16.2 / 0.17 ব্যবহার করছেন?
অ্যান্ডি হেডেন

4
@ ওয়েবেলো ডেটটাইম ইন্ডেক্স / সিরিজে নিজেই এমন একটি .dt.daysবৈশিষ্ট্য থাকা উচিত যা দৃ strongly়ভাবে পছন্দ করা উচিত।
অ্যান্ডি হেডেন

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

4
দুর্দান্ত উত্তর। আমার ক্ষেত্রে, df['C'] = (df['B'] - df['A']).dt.daysকাজ করে না এবং আমাকে ব্যবহার করতে হয়েছিল df['C'] = (df['B'] - df['A']).days। আমার ধারণা আশানুরূপ দিন কেন দেয়নি?
স্যামুয়েল এনডি

এনডি - ঠিক কিভাবে এটি কাজ করে না? ত্রুটি বা ভুল মান? আপনি কি সফলভাবে সফলভাবে ডেটটাইমে রূপান্তর করেছেন?
রিকি ম্যাকমাস্টার

4
আমার উভয় কলামগুলি তারিখের সময় (বা datetime64[ns]সুনির্দিষ্ট হতে হবে)। যখন আমি এটি করেছি df['C'] = (df['B'] - df['A']).dt.days, আমি একটি বৈশিষ্ট্য ত্রুটি পেয়েছি যা বলেছিল অ্যাট্রিবিউটআরার: 'টাইমডেল্টা' অবজেক্টটির কোনও 'dt' বৈশিষ্ট্য নেই , তাই আমি df ['C'] = (df ['B'] - df ['A']) চেষ্টা করেছি। দিনগুলি যা আমাকে পছন্দসই উত্তর দিয়েছে। (অবশ্যই আমি আমার নিজস্ব ডেটাফ্রেমটি উপরের উদাহরণের মতো ব্যবহার করছি না Or বা এটিও হতে পারে কারণ আমার সময়ও ছিল আমার তারিখে এবং সেই হিসাবে নয় 2018-09-24 10:17:18.800277)
স্যামুয়েল এনডি

4
নিখুঁত উত্তর.
ব্যবহারকারী 3065757

4
দুর্দান্ত সমাধান। ধন্যবাদ!
রদ্রিগো হজোর্ট

11

এটি করার জন্য সর্বাধিক পাইথোনিক (এবং দ্রুততম) উপায়ের জন্য তালিকা বোধগম্যতা আপনার সেরা বাজি:

[int(i.days) for i in (df.B - df.A)]
  1. আমি সময়সীমাটি ফেরত দেব (উদাঃ '-58 দিন')
  2. i.days একটি দীর্ঘ পূর্ণসংখ্যার মান হিসাবে উদ্বোধন করবে (যেমন -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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.