एक numpy.timedelta64 मान से दिन निकालना


87

मैं पांडा / अजगर का उपयोग कर रहा हूं और मेरे पास दो दिनांक समय श्रृंखला s1 और s2 है, जो दिनांक / समय वाले df के क्षेत्र पर 'to_datetime' फ़ंक्शन का उपयोग करके उत्पन्न किए गए हैं।

जब मैं s1 को s2 से घटाता हूं

s3 = s2 - s1

मुझे एक श्रृंखला मिलती है, s3, प्रकार की

timedelta64 [एनएस]

0    385 days, 04:10:36
1     57 days, 22:54:00
2    642 days, 21:15:23
3    615 days, 00:55:44
4    160 days, 22:13:35
5    196 days, 23:06:49
6     23 days, 22:57:17
7      2 days, 22:17:31
8    622 days, 01:29:25
9     79 days, 20:15:14
10    23 days, 22:46:51
11   268 days, 19:23:04
12                  NaT
13                  NaT
14   583 days, 03:40:39

मैं श्रृंखला के 1 तत्व को कैसे देखता हूं:

S3 [10]

मुझे ऐसा कुछ मिलता है:

numpy.timedelta64 (2069211000000000, 'एनएस')

मैं s3 से दिन कैसे निकालूं और हो सकता है कि उन्हें पूर्णांक के रूप में रखूं (घंटे / मिनट आदि में दिलचस्पी नहीं है)?

किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद।


4
बस FYI करें, पांडा में मर्ज करने के बारे में इस functionaility गुरु: github.com/pydata/pandas/pull/4534 (आप इस 0.12 पर कर सकते हैं और इससे पहले कि द्वारा:s.apply(lambda x: x / np.timedelta64(1,'D'))
जेफ

जवाबों:


146

आप इसे एक दिन की सटीकता के साथ एक टाइमडेल्टा में बदल सकते हैं। दिनों के पूर्णांक मान को निकालने के लिए आप इसे एक दिन के समय के साथ विभाजित करते हैं।

>>> x = np.timedelta64(2069211000000000, 'ns')
>>> days = x.astype('timedelta64[D]')
>>> days / np.timedelta64(1, 'D')
23

या, जैसा कि @PhillipCloud सुझाव दिया, बस days.astype(int)के बाद से timedeltaसिर्फ एक 64 बिट पूर्णांक है कि दूसरा पैरामीटर आपके द्वारा व्यतीत के आधार पर विभिन्न तरीकों से व्याख्या की है ( 'D', 'ns', ...)।

आप इसके बारे में अधिक जानकारी यहाँ पा सकते हैं ।


16
आप यह भी कर सकते हैं days.item().daysया days.astype(int)
फिलिप क्लाउड

1
पांडा के अधिक हाल के संस्करण पूर्ण विकसित Timedelta प्रकार का समर्थन करते हैं, यहां डॉक्स देखें: pandas.pydata.org/pandas-docs/stable/timedeltas.html
Jeff

.Apply के लिए यह एक अच्छा उम्मीदवार है। आप इसे उसी पंक्ति में कर सकते हैं, जहाँ आप कॉलम स्तर पर रूपांतरण लागू करने के लिए .apply (लैम्ब्डा x: x / np.timedelta64 (1, 'D')) डालकर कॉलम मानों की गणना करते हैं। उदा। s3 = (s1-s2) .apply (लंबो x: x / np.timedelta64 (1, 'D'))।
ईजेकील क्रुगलिक

2
यह विधि astype('timedelta64[D]')(लगभग 96ms) dt.days.4,000,000 पंक्तियों के लिए (लगभग 24s) की तुलना में बहुत अधिक कुशल है ।
पेंगू झाओ

37

dt.daysपूर्णांक के रूप में दिनों की विशेषता प्राप्त करने के लिए उपयोग करें ।

उदाहरण के लिए:

In [14]: s = pd.Series(pd.timedelta_range(start='1 days', end='12 days', freq='3000T'))

In [15]: s
Out[15]: 
0    1 days 00:00:00
1    3 days 02:00:00
2    5 days 04:00:00
3    7 days 06:00:00
4    9 days 08:00:00
5   11 days 10:00:00
dtype: timedelta64[ns]

In [16]: s.dt.days
Out[16]: 
0     1
1     3
2     5
3     7
4     9
5    11
dtype: int64

अधिक आम तौर पर - आप .componentsसंपत्ति का उपयोग कम किए गए फॉर्म तक पहुंचने के लिए कर सकते हैं timedelta

In [17]: s.dt.components
Out[17]: 
   days  hours  minutes  seconds  milliseconds  microseconds  nanoseconds
0     1      0        0        0             0             0            0
1     3      2        0        0             0             0            0
2     5      4        0        0             0             0            0
3     7      6        0        0             0             0            0
4     9      8        0        0             0             0            0
5    11     10        0        0             0             0            0

अब, hoursविशेषता प्राप्त करने के लिए :

In [23]: s.dt.components.hours
Out[23]: 
0     0
1     2
2     4
3     6
4     8
5    10
Name: hours, dtype: int64

+1 - यह वर्तमान में ऐसा करने का सबसे अच्छा तरीका है क्योंकि पंडों के पैकेज में प्रगति हुई है क्योंकि यह प्रश्न पूछा गया था।
ऑस्टिन ए

7

मान लीजिए कि आपके पास एक समयबद्ध श्रृंखला है:

import pandas as pd
from datetime import datetime
z = pd.DataFrame({'a':[datetime.strptime('20150101', '%Y%m%d')],'b':[datetime.strptime('20140601', '%Y%m%d')]})

td_series = (z['a'] - z['b'])

इस टाइमडेल्टा कॉलम या श्रृंखला को बदलने का एक तरीका यह है कि इसे टेमेडेल्टा ऑब्जेक्ट (पांडा 0.15.0+) में डाला जाए और फिर ऑब्जेक्ट से दिनों को निकाला जाए:

td_series.astype(pd.Timedelta).apply(lambda l: l.days)

एक और तरीका यह है कि श्रृंखला को दिनों में एक समयबद्धता के रूप में रखा जाए, और फिर इसे एक इंट के रूप में डाला जाए:

td_series.astype('timedelta64[D]').astype(int)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.