পাইথন পান্ডাস ব্যবহার করে তারিখ এবং সময় কলামগুলি একত্রিত করুন


113

আমার কাছে নীচের কলামগুলির সাথে একটি পান্ডাস ডেটা ফ্রেম রয়েছে;

Date              Time
01-06-2013      23:00:00
02-06-2013      01:00:00
02-06-2013      21:00:00
02-06-2013      22:00:00
02-06-2013      23:00:00
03-06-2013      01:00:00
03-06-2013      21:00:00
03-06-2013      22:00:00
03-06-2013      23:00:00
04-06-2013      01:00:00

নিম্নলিখিতগুলি পেতে কীভাবে আমি ডেটা ['তারিখ'] এবং ডেটা ['সময়'] একত্রিত করব? এটি ব্যবহার করার কোনও উপায় আছে pd.to_datetime?

Date
01-06-2013 23:00:00
02-06-2013 01:00:00
02-06-2013 21:00:00
02-06-2013 22:00:00
02-06-2013 23:00:00
03-06-2013 01:00:00
03-06-2013 21:00:00
03-06-2013 22:00:00
03-06-2013 23:00:00
04-06-2013 01:00:00

সবগুলো উত্তরের জন্য ধন্যবাদ। আমি তাদের বেশিরভাগের চেষ্টা করেছি কিন্তু এখনও যখন আমি এই ডেটটাইম তথ্যটি একটি বড় ডেটা ফ্রেমের অংশ হিসাবে যুক্ত করি। ডেটটাইম কলাম কেবল তারিখ প্রদর্শন করে এবং সময় তথ্য প্রদর্শিত হয় না। আমাদের কি বুঝতে হবে যে সময়টি এখানে লুকানো আছে বা এটি সরিয়ে দেওয়া হয়েছে?
কার্তিকেইয়ান

উত্তর:


169

এটি উল্লেখ করার মতো যে আপনি এটি সরাসরি পড়তে সক্ষম হতে পারেন যেমন আপনি যদি ব্যবহার read_csvকরছেন parse_dates=[['Date', 'Time']]

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

In [11]: df['Date'] + ' ' + df['Time']
Out[11]:
0    01-06-2013 23:00:00
1    02-06-2013 01:00:00
2    02-06-2013 21:00:00
3    02-06-2013 22:00:00
4    02-06-2013 23:00:00
5    03-06-2013 01:00:00
6    03-06-2013 21:00:00
7    03-06-2013 22:00:00
8    03-06-2013 23:00:00
9    04-06-2013 01:00:00
dtype: object

In [12]: pd.to_datetime(df['Date'] + ' ' + df['Time'])
Out[12]:
0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00
dtype: datetime64[ns]

দ্রষ্টব্য: আশ্চর্যরূপে (আমার জন্য), এটি NaN- কে NaT তে রূপান্তরিত করার সাথে সূক্ষ্মভাবে কাজ করে, তবে এটি রূপান্তর (সম্ভবত raiseযুক্তি ব্যবহার করে ) উদ্বেগজনক ।


6
স্বয়ংক্রিয় সমন্বয় বৈশিষ্ট্য সম্পর্কে জানেন না, ও এর মত খুব একাধিক এন্ট্রি সঙ্গে কাজ করে: parse_dates=[['Start date', 'Start time'], ['End date', 'End time']])। পান্ডাস <3
5

43

গৃহীত উত্তর ডেটাটাইপযুক্ত কলামগুলির জন্য কাজ করে string। সম্পূর্ণতার জন্য: কলামগুলি যখন ডেটাটাইপের হয় তখন এটি কীভাবে করবেন তা অনুসন্ধান করার সময় আমি এই প্রশ্নটি জুড়ে এসেছি: তারিখ এবং সময়।

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']),1)

2
timeপাণ্ডায় dtype সম্পর্কিত কিছু খুঁজে পাচ্ছি না । আমার পরিবর্তে আমার কাছে একটি timedelta(এবং ক datetime) রয়েছে যা ক্ষেত্রে আপনার কেবল তাদের যুক্ত করা দরকার, আমার উত্তর দেখুন
টোটো_টিকো

আমি যখন 'পিডি.ড্রেড_এক্সসেল' করি যখন এক্সেলটি "সময়" হিসাবে চিহ্নিত করে একটি এক্সেল কলাম, পান্ডস কোনও পার্সিং যুক্তি ছাড়াই স্বয়ংক্রিয়ভাবে এটিকে "সময়" হিসাবে পড়েন। এই সমাধানের জন্য ধন্যবাদ। +1
Saeed

1
প্যান্ডাসের ১.০.০ হিসাবে কেবল একটি নোট অবমুক্ত pd.datetime করা হয়েছে এবং এর datetimeপরিবর্তে কেবল স্পষ্টভাবে মডিউলটি আমদানি করার পরামর্শ দেওয়া হয়েছে ।
কপোঅনআরুন

16

আপনি এটি ডেটাফ্রেমের একই কলামে তারিখ এবং সময় একত্রিত করতে ব্যবহার করতে পারেন।

import pandas as pd    
data_file = 'data.csv' #path of your file

একত্রিত কলামগুলির সাথে তারিখের সময় .csv ফাইলটি পড়া:

data = pd.read_csv(data_file, parse_dates=[['Date', 'Time']]) 

আপনি এই লাইনটি অন্য দুটি কলামও রাখতে ব্যবহার করতে পারেন।

data.set_index(['Date', 'Time'], drop=False)

1
আপনি date_parserparser = lambda date: pd.datetime.strptime(date, '%d-%b-%y %H:%M:%S')
সেরেন্ডিপিটি

11

প্রকারগুলি পৃথক (ডেটটাইম এবং টাইমস্ট্যাম্প বা স্ট্রিম) হয়ে থাকে এবং টু ডেটটাইম ব্যবহার করে আপনি কলামগুলি কাস্ট করতে পারেন:

df.loc[:,'Date'] = pd.to_datetime(df.Date.astype(str)+' '+df.Time.astype(str))

ফলাফল :

0   2013-01-06 23:00:00
1   2013-02-06 01:00:00
2   2013-02-06 21:00:00
3   2013-02-06 22:00:00
4   2013-02-06 23:00:00
5   2013-03-06 01:00:00
6   2013-03-06 21:00:00
7   2013-03-06 22:00:00
8   2013-03-06 23:00:00
9   2013-04-06 01:00:00

সেরা


10

Jka.ne এ মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই :

এটি কাজ করার জন্য আমাকে জে.কা.নেনের লাইনটি সংশোধন করতে হয়েছিল:

df.apply(lambda r : pd.datetime.combine(r['date_column_name'],r['time_column_name']).time(),1)

এটি অন্যকে সাহায্য করতে পারে।

এছাড়াও, আমি এর replaceপরিবর্তে ব্যবহার করে একটি ভিন্ন পদ্ধতির পরীক্ষা করেছি combine:

def combine_date_time(df, datecol, timecol):
    return df.apply(lambda row: row[datecol].replace(
                                hour=row[timecol].hour,
                                minute=row[timecol].minute),
                    axis=1)

ওপি-র ক্ষেত্রে যা হবে:

combine_date_time(df, 'Date', 'Time')

আমি তুলনামূলকভাবে বড় ডেটাসেট (> 500.000 সারি) জন্য উভয় পদ্ধতির সময়সীমা করেছি এবং তাদের উভয়ের একই রানটাইম রয়েছে তবে ব্যবহার combineদ্রুত হয় ( replace50s এর জন্য 59 এর জন্য combine) s


5

উত্তরটি আপনার কলামের প্রকারগুলি কী তা নির্ভর করে । আমার ক্ষেত্রে, আমার ছিল datetimeএবং timedelta

> df[['Date','Time']].dtypes
Date     datetime64[ns]
Time    timedelta64[ns]

যদি এটি আপনার ক্ষেত্রে হয় তবে আপনাকে কেবল কলামগুলি যুক্ত করতে হবে:

> df['Date'] + df['Time']

গৃহীত উত্তরটি স্ট্রিং ধরে: "এগুলি কেবল স্ট্রিং মনে করে আপনি এগুলি কেবল একসাথে যুক্ত করতে পারেন (একটি স্থান সহ)" । আমার উত্তরগুলি datetimeএবং এর জন্য timedelta। মূল উত্তরটি একরকম বুঝতে পারে যে কলামগুলি স্ট্রিংগুলি ছিল, বা সম্ভবত এটি উত্তর ছিল যা প্রশ্ন পোস্ট করেছে তার পক্ষে কাজ করেছে।
টোটো_টিকো

4

আপনি datetimeস্ট্রিং কনটেনটেশন ছাড়াই রূপান্তর করতে পারেন , একত্রিত করে datetimeএবং timedeltaঅবজেক্টগুলি। এর সাথে pd.DataFrame.popএকত্রিত হয়ে আপনি একই সাথে উত্স সিরিজটি মুছে ফেলতে পারেন:

df['DateTime'] = pd.to_datetime(df.pop('Date')) + pd.to_timedelta(df.pop('Time'))

print(df)

             DateTime
0 2013-01-06 23:00:00
1 2013-02-06 01:00:00
2 2013-02-06 21:00:00
3 2013-02-06 22:00:00
4 2013-02-06 23:00:00
5 2013-03-06 01:00:00
6 2013-03-06 21:00:00
7 2013-03-06 22:00:00
8 2013-03-06 23:00:00
9 2013-04-06 01:00:00

print(df.dtypes)

DateTime    datetime64[ns]
dtype: object

1
দুর্দান্ত সাধারণ সমাধান! আমার টাইপ করার তারিখ এবং তারিখ টাইম ছিল এবং এটি কাজ করে।
স্প্যারো

3

প্রথমে সঠিক ডেটা ধরণের রয়েছে তা নিশ্চিত করুন:

df["Date"] = pd.to_datetime(df["Date"])
df["Time"] = pd.to_timedelta(df["Time"])

তারপরে আপনি এগুলি সহজেই একত্রিত করুন:

df["DateTime"] = df["Date"] + df["Time"]


2

আমার ডেটাসেটে কয়েক দিনের জন্য 1 সেকেন্ড রেজোলিউশন ডেটা ছিল এবং এখানে প্রস্তাবিত পদ্ধতিগুলির দ্বারা পার্সিং খুব ধীর ছিল। পরিবর্তে আমি ব্যবহার:

dates = pandas.to_datetime(df.Date, cache=True)
times = pandas.to_timedelta(df.Time)
datetimes  = dates + times

cache=Trueনোটগুলি পার্সিংয়ের ব্যবহারটি খুব কার্যকরীভাবে নোট করুন যেহেতু আমার ফাইলগুলিতে কেবল কয়েকটি অনন্য তারিখ রয়েছে, যা সম্মিলিত তারিখ এবং সময় কলামের ক্ষেত্রে সত্য নয়।


এই আমি কি করতে হবে।
ইয়াকভ ব্র্রেসার

1

ডেটা:

<TICKER>, <PER>, <তারিখ>, <TIME> , <ওপেন>, <হাই>, <LOW>, <CLOSE>, <ভোল> এসপিএফবি.আরটিএস, 1, 20190103,100100 , 106580.0000000,107260.0000000,106570.0000000 , 107230.0000000,3726

কোড:

data.columns = ['ticker', 'per', 'date', 'time', 'open', 'high', 'low', 'close', 'vol']    
data.datetime = pd.to_datetime(data.date.astype(str) + ' ' + data.time.astype(str), format='%Y%m%d %H%M%S')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.