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


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.