ঘন্টা এবং মিনিটে দুটি কলামের মধ্যে পান্ডাস ডেটা ফ্রেম সময়ের পার্থক্য গণনা করুন


85

আমার একটি ডেটা ফ্রেমে দুটি কলাম fromdateএবং todateরয়েছে।

import pandas as pd

data = {'todate': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000'), pd.Timestamp('2014-01-23 10:07:47.660000')],
        'fromdate': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000'), pd.Timestamp('2014-01-23 18:50:41.420000')]}

df = pd.DataFrame(data)

diffব্যবহার করে দুটি তারিখের মধ্যে পার্থক্য খুঁজে পেতে, আমি একটি নতুন কলাম যুক্ত করব

df['diff'] = df['fromdate'] - df['todate']

আমি diffকলামটি পেয়েছি , তবে এটিতে রয়েছে days, যখন 24 ঘন্টারও বেশি সময় থাকে।

                   todate                fromdate                   diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870 2 days 10:38:09.820000
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.540 0 days 03:41:04.300000
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.420 0 days 08:42:53.760000

আমি কীভাবে আমার ফলাফলকে কেবল কয়েক ঘন্টা এবং মিনিটে রূপান্তর করব (অর্থাত্‍ দিনগুলিকে ঘন্টার মধ্যে রূপান্তর করা হয়)?

উত্তর:


127

পান্ডাস টাইমস্ট্যাম্প পার্থক্য একটি ডেটটাইম.টিমেডেল্টা অবজেক্ট দেয়। এটি যেমন * as_type * পদ্ধতিটি ব্যবহার করে খুব সহজেই ঘন্টাগুলিতে রূপান্তর করা যায়

import pandas
df = pandas.DataFrame(columns=['to','fr','ans'])
df.to = [pandas.Timestamp('2014-01-24 13:03:12.050000'), pandas.Timestamp('2014-01-27 11:57:18.240000'), pandas.Timestamp('2014-01-23 10:07:47.660000')]
df.fr = [pandas.Timestamp('2014-01-26 23:41:21.870000'), pandas.Timestamp('2014-01-27 15:38:22.540000'), pandas.Timestamp('2014-01-23 18:50:41.420000')]
(df.fr-df.to).astype('timedelta64[h]')

ফলন,

0    58
1     3
2     8
dtype: float64

অ্যাস্টাইপ ওয়ার্কারআউন্ড কাজ করে তবে বড় (0.5 মিলিয়ন সারি) ফাইলের জন্য এটি খুব ধীর। অন্য কোন পরামর্শ?
— ছাত্র 1

4
টাইমডেল্টা অবজেক্টটির দিন এবং সেকেন্ডের জন্য একটি বৈশিষ্ট্য রয়েছে ... আপনি করেন, (df.fr-df.to) .dt.days * 24 + (df.fr-df.to) .dt.seconds / 3600
— nitin

4
ধন্যবাদ! এটি আমার জন্য বছর গণনার জন্যও (বয়স পেতে) কাজ করেছে: ডিএফ ['বয়স'] = (ডিএফ ['পরে_সামগ্রহ'] - ডিএফ ['জন্ম_ তারিখ'])। অ্যাস্টাইপ ('টাইমডেলটা 64 [ওয়াই]')
— সুপারডুপার

49

.astype()উপরের সমাধানটি আমার পক্ষে কাজ না করায় এটি আমার বোনারদের চালাচ্ছিল । তবে আমি আর একটি উপায় খুঁজে পেয়েছি। এটি বা কোনও কিছু সময়সই হয়নি, তবে অন্যদের জন্য সেখানে কাজ করতে পারে:

t1 = pd.to_datetime('1/1/2015 01:00')
t2 = pd.to_datetime('1/1/2015 03:30')

print pd.Timedelta(t2 - t1).seconds / 3600.0

... আপনি যদি ঘন্টা চান। বা:

print pd.Timedelta(t2 - t1).seconds / 60.0

... যদি আপনি কয়েক মিনিট চান।


9
আমারও একই সমস্যা ছিল, তবে আপনার সমাধানের সাথে একদিনের চেয়ে বড় সময়ের পার্থক্য উপেক্ষা করা এবং আলাদাভাবে অন্তর্ভুক্ত করা দরকার হিসাবে আপনার সাবধান হওয়া দরকার
— ঘোড়াশালা

41
আমি শুধু দেখা গেছে যে .total_seconds()যারা এটি প্রয়োজন জন্য পেশা আছে
— নাল

অদ্ভুতভাবে (আমি 4 বছর পরে ঠাহর করছি), আপনি ডান বন্ধনী ব্যবহার করতে হবে ()জন্য .total_seconds()কিন্তু না.seconds
— elPastor

5
import pandas as pd

# test data from OP, with values already in a datetime format
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000'), pd.Timestamp('2014-01-23 10:07:47.660000')],
        'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000'), pd.Timestamp('2014-01-23 18:50:41.420000')]}

# test dataframe; the columns must be in a datetime format; use pandas.to_datetime if needed
df = pd.DataFrame(data)

# add a timedelta column if wanted. It's added here for information only
# df['time_delta_with_sub'] = df.from_date.sub(df.to_date)  # also works
df['time_delta'] = (df.from_date - df.to_date)

# create a column with timedelta as total hours, as a float type
df['tot_hour_diff'] = (df.from_date - df.to_date) / pd.Timedelta(hours=1)

# create a colume with timedelta as total minutes, as a float type
df['tot_mins_diff'] = (df.from_date - df.to_date) / pd.Timedelta(minutes=1)

# display(df)
                  to_date               from_date             time_delta  tot_hour_diff  tot_mins_diff
0 2014-01-24 13:03:12.050 2014-01-26 23:41:21.870 2 days 10:38:09.820000      58.636061    3518.163667
1 2014-01-27 11:57:18.240 2014-01-27 15:38:22.540 0 days 03:41:04.300000       3.684528     221.071667
2 2014-01-23 10:07:47.660 2014-01-23 18:50:41.420 0 days 08:42:53.760000       8.714933     522.896000

অন্যান্য পদ্ধতি

  • অন্যান্য সংস্থানগুলিতে পডকাস্টের একটি নোটের আইটেমটি .total_seconds()মূল বিকাশকারী অবকাশে থাকাকালীন যুক্ত এবং একত্রীকরণ করা হয়েছিল এবং অনুমোদিত হত না।
    • অন্যান্য .total_xxপদ্ধতি নেই কেন এই কারণ ।
# convert the entire timedelta to seconds
# this is the same as td / timedelta(seconds=1)
(df.from_date - df.to_date).dt.total_seconds()
[out]:
0    211089.82
1     13264.30
2     31373.76
dtype: float64

# get the number of days
(df.from_date - df.to_date).dt.days
[out]:
0    2
1    0
2    0
dtype: int64

# get the seconds for hours + minutes + seconds, but not days
# note the difference from total_seconds
(df.from_date - df.to_date).dt.seconds
[out]:
0    38289
1    13264
2    31373
dtype: int64

অন্যান্য উৎস

%%timeit পরীক্ষা

import pandas as pd

# dataframe with 2M rows
data = {'to_date': [pd.Timestamp('2014-01-24 13:03:12.050000'), pd.Timestamp('2014-01-27 11:57:18.240000')], 'from_date': [pd.Timestamp('2014-01-26 23:41:21.870000'), pd.Timestamp('2014-01-27 15:38:22.540000')]}
df = pd.DataFrame(data)
df = pd.concat([df] * 1000000).reset_index(drop=True)

%%timeit
(df.from_date - df.to_date) / pd.Timedelta(hours=1)
[out]:
43.1 ms ± 1.05 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
(df.from_date - df.to_date).astype('timedelta64[h]')
[out]:
59.8 ms ± 1.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.