আমি কীভাবে পান্ডাস ডেটা ফ্রেমে তারিখগুলিকে একটি 'তারিখ' ডেটা টাইপের রূপান্তর করব?


107

আমার কাছে পান্ডাস ডেটা ফ্রেম রয়েছে, একটি কলামে ফর্ম্যাটে তারিখের স্ট্রিং রয়েছে YYYY-MM-DD

যেমন যেমন '2013-10-28'

এই মুহূর্তে dtypeকলামের হয় object

কীভাবে আমি কলাম মানকে পান্ডাস তারিখের ফর্ম্যাটে রূপান্তর করব?

উত্তর:


115

অ্যাস্টাইপ ব্যবহার করুন

In [31]: df
Out[31]: 
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [32]: df['time'] = df['time'].astype('datetime64[ns]')

In [33]: df
Out[33]: 
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

4
সুন্দর - আপনাকে ধন্যবাদ - প্রতিটি তারিখের শেষে আমি কীভাবে 00:00:00 থেকে মুক্তি পাব?
ব্যবহারকারী 7289

4
পান্ডার টাইমস্ট্যাম্পের তারিখ এবং সময় উভয়ই থাকে। আপনি কি এটি অজগর তারিখ অবজেক্টে রূপান্তর করতে চান?
ওয়েটিংকুও

7
আপনি এটিকে রূপান্তর করতে পারেনdf['time'] = [time.date() for time in df['time']]
1313

4
[এনএস] এর অর্থ কী, আপনি কি পাঠ্যের স্ট্রিংকে একটি তারিখ তৈরি করতে এবং সেই তারিখের সময়ের অংশটি সরাতে পারবেন?
যোশিশারি

4
@ যোশিসারি এটি ন্যানোসেকেন্ডস এবং এটি হ'ল যেভাবে তারিখগুলি একবারে সঠিকভাবে রূপান্তরিত হয় (ন্যানোসেকেন্ডে যুগের সময়) stored
অ্যান্ডি হেডেন

117

মূলত @ ওয়েটিংকুওর সমতুল্য, তবে আমি to_datetimeএখানে ব্যবহার করব (এটি কিছুটা ক্লিনার বলে মনে হচ্ছে এবং কিছু অতিরিক্ত কার্যকারিতা যেমন dayfirst:)

In [11]: df
Out[11]:
   a        time
0  1  2013-01-01
1  2  2013-01-02
2  3  2013-01-03

In [12]: pd.to_datetime(df['time'])
Out[12]:
0   2013-01-01 00:00:00
1   2013-01-02 00:00:00
2   2013-01-03 00:00:00
Name: time, dtype: datetime64[ns]

In [13]: df['time'] = pd.to_datetime(df['time'])

In [14]: df
Out[14]:
   a                time
0  1 2013-01-01 00:00:00
1  2 2013-01-02 00:00:00
2  3 2013-01-03 00:00:00

হ্যান্ডলিং ValueErrorগুলি
আপনি যদি এমন কোনও পরিস্থিতিতে চলে যান যেখানে করছেন

df['time'] = pd.to_datetime(df['time'])

নিক্ষেপ a

ValueError: Unknown string format

এর অর্থ আপনার অবৈধ (অস-সহবাসযোগ্য) মান রয়েছে। আপনি যদি এগুলিতে রূপান্তরিত হয়ে ঠিক থাকেন তবে আপনি এখানে যুক্তি pd.NaTযুক্ত করতে পারেন :errors='coerce'to_datetime

df['time'] = pd.to_datetime(df['time'], errors='coerce')

হাই গাইস, @ অ্যান্ডে হাইডেন আপনি কি তারিখ থেকে সময়ের অংশটি সরাতে পারবেন? আমার সেই অংশের দরকার নেই?
yoshiserry

পান্ডাসের '0.13.1-এ অনুমানযোগ্য 00: 00: 00 সেগুলি প্রদর্শিত হয় না।
অ্যান্ডি হেডেন

এবং অন্যান্য সংস্করণগুলির কী, আমরা কীভাবে সেগুলি প্রদর্শন করব / এবং বা না প্রদর্শিত করব?
yoshiserry

আমি মনে করি না এটি একটি দুর্দান্ত উপায়ে করা যেতে পারে, ফ্লোট_ ফর্ম্যাট (যা আপনি দেখেছেন) এর মতো ডেট_ফর্ম্যাট যুক্ত করার জন্য আলোচনা রয়েছে। আমি যাইহোক আপগ্রেড করার পরামর্শ দিচ্ছি।
অ্যান্ডি হেডেন

আমার সমস্যাটি হ'ল আমার তারিখটি এই ফর্ম্যাটে ... 41516.43, এবং আমি এই ত্রুটিটি পেয়েছি। আমি আশা করব এটি নতুন কলামে 2014-02-03 এর মতো কিছু ফেরত দেবে ?! ত্রুটি: # "লোড_ডেট" কলামে তারিখের বাজেট_ডেটসেট ['তারিখ_সালিকা_লোড'] = পিডি। টো-ডেটটাইম (বাজেট_ডেটসেট ['লোড_ডেট']) বাজেট_ডেটসেট-সি: 2: সেটিংউইথকপি ওয়ার্নিং: একটি মান সেট করার চেষ্টা করা হচ্ছে একটি ডেটা ফ্রেম থেকে একটি স্লাইসের অনুলিপি। পরিবর্তে .loc [সারি_আইডেক্স, কল_ইন্ডেক্সার] = মানটি ব্যবহার করার চেষ্টা করুন
যোশিশেরি

37

আমি ভেবেছি সিএসভি ফাইলগুলি থেকে প্রচুর ডেটা পান্ডসে আসে, সেক্ষেত্রে প্রাথমিক সিএসভি পড়ার সময় আপনি কেবল তারিখটি রূপান্তর করতে পারেন:

dfcsv = pd.read_csv('xyz.csv', parse_dates=[0])যেখানে 0 কলামটি তারিখটি উল্লেখ করে
You আপনি এটি যুক্ত করতে পারেন, index_col=0 সেখানে তারিখটি আপনার সূচক হতে চাইলে আপনি সেখানে করতে পারেন।

Https://pandas.pydata.org/pandas-docs/stable/references/api/pandas.read_csv.html দেখুন


ধন্যবাদ, এটাই আমার দরকার ছিল। ডকুমেন্টেশনটি সরানো হয়েছে, যদিও আপনি এটি এখানে খুঁজে পেতে পারেন: pandas.pydata.org/pandas-docs/stable/references/api/…
সস্তিবি

24

এখন আপনি করতে পারেন df['column'].dt.date

মনে রাখবেন যে ডেটটাইম অবজেক্টের জন্য, আপনি যদি সমস্ত 00:00:00 ঘন্টা সময় না দেখেন তবে তা পান্ডাস নয়। জিনিসগুলি সুন্দর দেখানোর চেষ্টা করছে এটি আইপিথন নোটবুক।


4
এইটি আমার পক্ষে কাজ করে না, এটি অভিযোগ করে: কেবল তারিখের মতো মান সহ .dt অ্যাক্সেসর ব্যবহার করতে পারে
স্মৃতি মেশিন

4
আপনাকে যা করতে হবে পারে df[col] = pd.to_datetime(df[col])প্রথম ডেট সময় বস্তু আপনার কলাম রূপান্তর করবে।
szeitlin

4
এই উত্তরের সমস্যাটি হ'ল এটি কলামকে রূপান্তর করে dtype = objectযা datetime dtypeপান্ডগুলিতে সত্যের চেয়ে যথেষ্ট বেশি স্মৃতি গ্রহণ করে ।
এলপাস্টার


6

এটি করার আরেকটি উপায় এবং ডেটটাইমে রূপান্তর করতে আপনার একাধিক কলাম থাকলে তা ভালভাবে কাজ করে।

cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)

প্রশ্ন তারিখের জন্য নয় তারিখের জন্য জিজ্ঞাসা করুন।
মার্ক অ্যান্ডারসন

@ মারকএন্ডারসন যেমন dateআপনার কলামগুলিতে কেবলমাত্র মান রয়েছে, ডেটটাইমে রূপান্তর কেবল সম্পর্কিত তথ্য ধরে রাখতে পারে। আপনি যদি তা ব্যবহার করে স্পষ্টত রূপান্তর করেন df['datetime_col'].dt.dateতবে ফলাফলটি objectটাইপ হয়ে যাবে; মেমরি পরিচালনায় ক্ষতি।
সুমন্ত লাজারাস

1

এটি এমন ক্ষেত্রে হতে পারে যে তারিখগুলি আলাদা ফ্রিকোয়েন্সিতে রূপান্তরিত হওয়া দরকার। এই ক্ষেত্রে, আমি তারিখ অনুসারে একটি সূচক সেট করার পরামর্শ দেব।

#set an index by dates
df.set_index(['time'], drop=True, inplace=True)

এর পরে, আপনি সবচেয়ে বেশি প্রয়োজন তারিখের ফর্ম্যাটটিতে আরও সহজে রূপান্তর করতে পারেন। নীচে, আমি ধারাবাহিকভাবে মাসের শুরুতে দৈনিক তারিখের সেট দিয়ে শেষ পর্যন্ত একাধিক তারিখের ফর্ম্যাটগুলিতে রূপান্তর করি।

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

#Convert to monthly dates
df.index = df.index.to_period(freq='M')

#Convert to strings
df.index = df.index.strftime('%Y-%m')

#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)

বংশবৃদ্ধির জন্য, আমি দেখাব না যে আমি উপরের প্রতিটি লাইনের পরে নিম্নলিখিত কোডটি চালাচ্ছি:

print(df.index)
print(df.index.dtype)
print(type(df.index))

এটি আমাকে নিম্নলিখিত ফলাফল দেয়:

Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>

Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>

DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

0

পিডি.টো_ডেটটাইম ফাংশনটি ব্যবহার করে সারির একটিকে টাইমস্ট্যাম্পে রূপান্তর করার চেষ্টা করুন এবং তারপরে পুরো কলামে সূত্রটি ম্যাপ করতে .map ব্যবহার করুন


0
 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  object
 1   endDay          110526 non-null  object

import pandas as pd

df['startDay'] = pd.to_datetime(df.startDay)

df['endDay'] = pd.to_datetime(df.endDay)

 #   Column          Non-Null Count   Dtype         
---  ------          --------------   -----         
 0   startDay        110526 non-null  datetime64[ns]
 1   endDay          110526 non-null  datetime64[ns]

0

সম্পূর্ণতার জন্য, অন্য একটি বিকল্প, যা সবচেয়ে সোজা হতে পারে না, এটি @ এসএসএসের প্রস্তাবিত চেয়ে কিছুটা অনুরূপ, তবে ডেটটাইম লাইব্রেরিটি ব্যবহার করে:

import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.