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


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.