প্যান্ডাস. টু_ডেটটাইম ব্যবহার করার সময় কেবলমাত্র তারিখের অংশটি রাখুন


201

আমি pandas.to_datetimeআমার ডেটাগুলিতে তারিখগুলি বিশ্লেষণ করতে ব্যবহার করি। ডিফল্টভাবে পান্ডারা তারিখগুলি প্রতিনিধিত্ব করে datetime64[ns]যদিও তারিখগুলি কেবলমাত্র দৈনিক। আমি অবাক হয়েছি যে তারিখগুলিকে রূপান্তর করার জন্য কোনও মার্জিত / চতুর উপায় আছে datetime.dateবা datetime64[D]তাই, যখন আমি সিএসভিতে ডেটা লিখি, তারিখগুলি যুক্ত হয় না 00:00:00। আমি জানি আমি টাইপটি ম্যানুয়ালি এলিমেন্ট-বাই-এলিমেন্টে রূপান্তর করতে পারি:

[dt.to_datetime().date() for dt in df.dates]

তবে এটি সত্যিই ধীরে ধীরে ধীরে ধীরে আমার কাছে অনেকগুলি সারি রয়েছে এবং এটি ধরণের ব্যবহারের উদ্দেশ্যকে পরাস্ত করে pandas.to_datetimedtypeপুরো কলামটি একবারে রূপান্তর করার কোনও উপায় আছে কি ? অথবা বিকল্পভাবে, কোনও pandas.to_datetimeনির্ভুলতার জন্য কী স্পেসিফিকেশন সমর্থন করে যাতে আমি প্রতিদিনের ডেটা নিয়ে কাজ করার সময় সময়ের অংশ থেকে মুক্তি পেতে পারি?


2
আমি ভাল উপায় জানি না, তবে df.dates.apply(lambda x: x.date()) কমপক্ষে কিছুটা দ্রুত হওয়া উচিত। এছাড়াও github.com/pydata/pandas/issues/2583 দেখুন
রুট করুন


1
এই দুটি প্রশ্নকে আমি আলাদা হিসাবে বিবেচনা করব। আপনি যে ডুপ্লিকেটটিকে উল্লেখ করেছেন তা তারিখের অংশ এবং সময় অংশকে একটি ডেটটাইম কলাম থেকে বিভক্ত করে। এই প্রশ্নটি একবারে পুরো কলামটি রূপান্তরিত করে প্রেরণা পেয়েছে। কল্পনা করুন আপনার কাছে 20 টি কলামের সাথে ডেটাফ্রেম রয়েছে যা তারিখগুলি উপস্থাপন করে। অন্যান্য প্রশ্নে প্রস্তাবিত, আপনি কলামগুলি সিএসভিতে লিখতে হবে তা নির্দিষ্ট করতে চাইবেন না।

1
এটি এই মুহুর্তে সমর্থিত নয় (@ মূলটি সম্ভাব্য বর্ধনের দিকে নির্দেশ করে), সিএসভিতে লেখার সময় এটি করার উদ্দেশ্য কী?
জেফ

3
ঠিক আছে, প্রায়শই আমাদের অন্যান্য প্রোগ্রামগুলি পড়ার জন্য সিএসভি ফাইলগুলিতে ডেটা লিখতে হয়। অনর্থক 00:00:00 কেবল প্রক্রিয়া করা সহজতর করে তোলে, বিশেষত যখন আমি খালি দৈনিক ডেটা নিয়ে কাজ করি।

উত্তর:


285

সংস্করণ যেহেতু 0.15.0এখন .dtকেবলমাত্র তারিখের উপাদানটি অ্যাক্সেস ব্যবহার করে সহজেই করা যায় :

df['just_date'] = df['dates'].dt.date

datetime.dateউপরেরটি একটি টাইপ দেয়, আপনি যদি কিছু চান datetime64তবে আপনি কেবল normalizeমধ্যরাতে সময় উপাদান করতে পারেন যাতে এটিতে সমস্ত মান সেট করে 00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()

এটি ডাইটিপকে ঠিক রাখে datetime64তবে প্রদর্শনটি কেবলমাত্র dateমান দেখায় ।


33

সহজ সমাধান:

df['date_only'] = df['date_time_column'].dt.date

কেবল একটি সতর্কতা, এটি বস্তুর ধরণের পরিবর্তন করে। সুতরাং ধারাবাহিকতা বজায় রাখার জন্য আপনার অ্যাস্টাইপ ('ডেটটাইম 64') করা দরকার।
misantroop

25

আমি যখন এডচামের উত্তরটিকে অগ্রাহ্য করেছিলাম, যা ওপি জিজ্ঞাসা করা প্রশ্নের সর্বাধিক প্রত্যক্ষ উত্তর, তবে এটি কার্য সম্পাদন সমস্যাটি সত্যিই সমাধান করে না (এটি এখনও পাইথন datetimeবস্তুর উপর নির্ভর করে , এবং তাই তাদের উপর যে কোনও অপারেশন ভেক্টরাইজড হবে না - অর্থাৎ, এটি ধীর হবে)।

একটি ভাল পারফরম্যান্স বিকল্প ব্যবহার করা হয় df['dates'].dt.floor('d')। কঠোরভাবে বলতে গেলে, এটি "কেবলমাত্র তারিখের অংশ রাখে" না, যেহেতু এটি কেবল সময় নির্ধারণ করে 00:00:00। উদাহরণস্বরূপ, এটি ওপি দ্বারা পছন্দসইভাবে কাজ করে:

  • স্ক্রিনে মুদ্রণ
  • সিএসভিতে সঞ্চয়
  • কলামটি ব্যবহার করে groupby

... এবং এটি অনেক বেশি দক্ষ, যেহেতু অপারেশনটি ভেক্টরাইজ করা হয়েছে।

সম্পাদনা করুন: আসলে, উত্তর ওপি এর পছন্দ করে হয় সম্ভবত "এর সাম্প্রতিক সংস্করণ pandasনা না যদি তা না হয় CSV তে সময় লিখতে 00:00:00সব পর্যবেক্ষণের জন্য"।


দুর্ভাগ্যক্রমে to_jsonএখনও পুরো লিখুন 00:00:00
ইয়ানস

@ আইএনএস আপনি যখন ব্যবহার করছেন মানে date_format='iso'?! ডিফল্টরূপে, এটি যুগের ঠিক কয়েক সেকেন্ড পরে আউটপুট দেয়।
পিট্রো ব্যাটিস্টন

হ্যাঁ, এটাই আমি বোঝাতে চাইছিলাম
ইয়ানস

এটি dt.normalize()কয়েক শতাধিক উপাদানের চেয়ে সিরিজের চেয়ে দীর্ঘ is
C8H10N4O2

15

পান্ডাস DatetimeIndexএবং Seriesএকটি পদ্ধতি আছে normalizeযা আপনার যা ইচ্ছা ঠিক তা করে।

আপনি এই উত্তরে এটি সম্পর্কে আরও পড়তে পারেন ।

এটি হিসাবে ব্যবহার করা যেতে পারে ser.dt.normalize()


15

পান্ডাস v0.13 +: প্যারামিটার to_csvসহ ব্যবহার করুনdate_format

আপনার datetime64[ns]সিরিজটিকে কোনও objectধরণের ধরণের datetime.dateঅবজেক্টে রূপান্তরিত করে, এড়িয়ে চলুন । আধুনিক, প্রায়শই ব্যবহার করে নির্মিত pd.Series.dt.date, পয়েন্টারগুলির অ্যারে হিসাবে সংরক্ষণ করা হয় এবং খাঁটি নুমপি-ভিত্তিক সিরিজের তুলনায় অদক্ষ।

যেহেতু আপনার উদ্বেগ সিএসভিতে লেখার সময় ফর্ম্যাট , তাই এর date_formatপ্যারামিটারটি ব্যবহার করুন to_csv। উদাহরণ স্বরূপ:

df.to_csv(filename, date_format='%Y-%m-%d')

সম্মেলনের বিন্যাসের জন্য পাইথনের strftimeনির্দেশিকা দেখুন ।


8

এই তারিখটি বের করার একটি সহজ উপায়:

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)

ওপি ইতিমধ্যে তাদের প্রশ্নে। তারিখ () পদ্ধতিটি ব্যবহার করছে, সুতরাং এই সমাধানটি তাদের প্রশ্নের উত্তর দেয় না, তবে তারিখ () পদ্ধতিটি কেবল একটি রেফারেন্স হিসাবে ব্যবহার করার একটি সহজ উদাহরণটি দেখতে আমার পক্ষে দরকারী হয়েছিল।
নিক স্কোজজারো

5

রূপান্তর করা datetime64[D]:

df.dates.values.astype('M8[D]')

যদিও এটি একটি ডেটাফ্রেম কোলে পুনরায় বরাদ্দ করা এটিকে আবার [এনএস] এ ফিরিয়ে দেবে।

আপনি যদি প্রকৃত চেয়েছিলেন datetime.date:

dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])

3
আপনি যদি অ্যাস্টাইপ ('এম 8 [ডি]') ব্যবহার করেন তবে এটি অনুপস্থিত মানগুলিকে মূল তারিখ, 1970-1-1 তে রূপান্তর করে। আজকাল কেবলমাত্র পান্ডাস.টো_ডেটটাইম () ব্যবহার করা ভাল।
স্টিভবাকা

1
dtডেটটাইম মডিউলটি যে নিয়মিতভাবে অন্তর্ভুক্ত করে তার জন্য নোট করুন , এই উত্তর স্নিপেটটি সেই মডিউলটিকে ওভাররাইট করবে! @ ডেল-জং, সম্ভবত লাইনটি dt_index
yeliabsalohcin

আমি এমন একটি সমস্যাও খুঁজে পাচ্ছি যার পরের বারের চেষ্টা করার পরে এবং df.loc[date]পদ্ধতিটির মাধ্যমে একটি নতুন সারি যুক্ত করার পরে, সূচকটি একটি টাইমস্ট্যাম্পে ফিরে আসে, যার অর্থ পরবর্তী তুলনাগুলি আর কাজ করে না
yeliabsalohcin

3

কেউ যদি এই পুরানো পোস্টটি দেখেন তবে কেবলমাত্র একটি সাম্প্রতিক উত্তর দেওয়া।

ডেটটাইমে রূপান্তরিত করার সময় "utc = মিথ্যা" যুক্ত করা টাইমজোন উপাদানটি সরিয়ে দেবে এবং কেবল তারিখের সময়কাল [[ণ] ডাটা টাইপের মধ্যে রাখবে।

pd.to_datetime(df['Date'], utc=False)

"ভ্যালুয়েরর: এক্সেল টাইমজোনগুলির সাথে ডেটটাইম সমর্থন করে না Please দয়া করে নিশ্চিত করুন যে এক্সেলের কাছে লেখার আগে ডেটটাইমগুলি অসচেতন ensure"

এখানে চিত্র বর্ণনা লিখুন


আপনি কলাম সহ কোনও সামগ্রিক ফাংশন প্রয়োগ করার পরে এটি কোনও কারণে ব্যর্থ হয়।
রাফএক্সএক্স

0

আমি একটি ডেটা ফ্রেমে কলামগুলির সেটের জন্য টাইপটি পরিবর্তন করতে এবং তারপরে দিনটি রেখে সময়টি সরিয়ে রাখতে সক্ষম হতে চাই। বৃত্তাকার (), মেঝে (), সিল () সমস্ত কাজ

df[date_columns] = df[date_columns].apply(pd.to_datetime)
df[date_columns] = df[date_columns].apply(lambda t: t.dt.floor('d'))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.