दो घंटे और मिनटों में दो स्तंभों के बीच पंडों डेटाफ़्रेम समय अंतर की गणना करें


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कॉलम मिलता है , लेकिन इसमें days24 घंटे से अधिक समय होता है।

                   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

मैं अपने परिणामों को केवल घंटों और मिनटों में परिवर्तित कर सकता हूं (अर्थात दिन घंटों में परिवर्तित हो जाते हैं)?

जवाबों:


123

पंडों टाइमस्टैम्प मतभेद एक datetime.timedelta वस्तु देता है। इसे आसानी से घंटों में परिवर्तित किया जा सकता है, जैसे * 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

3
timedelta वस्तु दिन और सेकंड के लिए एक गुण है ... आप ऐसा करेंगे, (df.fr-df.to) .dt.days 24 + (df.fr-df.to) .dt.seconds / 3600 *
नितिन

1
धन्यवाद! । - astype ( 'timedelta64 [Y]') df [ 'उम्र'] = (df [ 'birth_date'] df [ 'later_date']): इस वर्ष की गणना (उम्र पाने के लिए), भी के लिए मेरे लिए काम किया
SuperDuper

47

यह मेरे लिए बोनर्स चला रहा था क्योंकि .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
मेरे पास भी यही समस्या थी, लेकिन आपके समाधान के साथ किसी को भी सावधान रहने की जरूरत है क्योंकि एक दिन से बड़े मतभेदों को नजरअंदाज किया जाता है और उन्हें अलग से शामिल करने की आवश्यकता होती है
horseshoe

39
मैंने अभी पाया कि .total_seconds()यह उन लोगों के लिए काम करता है जिन्हें इसकी आवश्यकता है
horseshoe

उत्सुकता से (मैं 4 साल बाद देख रहा हूं), आपको ().total_seconds().seconds
पार्न्स

5
  • मैं अपने परिणामों को केवल घंटों और मिनटों में कैसे परिवर्तित करूं
    • स्वीकृत उत्तर केवल रिटर्न देता है days + hoursमिनट शामिल नहीं हैं।
  • एक स्तंभ प्रदान करने के लिए जिसमें घंटे और मिनट होते हैं, hh:mmया x hours y minutes, अतिरिक्त गणना और स्ट्रिंग स्वरूपण की आवश्यकता होती है।
  • यह उत्तर दिखाता है कि timedeltaगणित के उपयोग से फ्लोट के रूप में कुल घंटे या कुल मिनट कैसे प्राप्त किए जा सकते हैं , और उपयोग करने की तुलना में तेज़ है.astype('timedelta64[h]')
  • पांडस टाइम डेल्टास यूजर गाइड
  • पंडों समय श्रृंखला / तिथि कार्यक्षमता उपयोगकर्ता गाइड
  • अजगर timedeltaवस्तुओं : समर्थित संचालन देखें।
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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.