मेरे पास नीचे के रूप में डेटाफ्रेम है

+-----------+------+--------------+
| invoiceNo | time | invoiceValue |
+-----------+------+--------------+
|     A     |   6  |       2      |
+-----------+------+--------------+
|     B     |  12  |       3      |
+-----------+------+--------------+
|     C     |  356 |       5      |
+-----------+------+--------------+
|     D     | 2145 |       6      |
+-----------+------+--------------+

df = pd.DataFrame({'invoiceNo':['A','B','C','D'],
             'time':[6,12,356,2145],
             'invoiceValue':[2,3,5,6] })

मेरा काम संबंधित hour को time मान से निकालना है।

हालांकि, समस्या यह है कि आदर्श रूप से time कॉलम में 4 अंक होने चाहिए। लेकिन, संख्या स्वरूपण के कारण, यह अग्रणी शून्य को हटा देता है। इसलिए, यहाँ 6 का अर्थ है 0006 जो कि 00 hour और 06 minutes है

इसे पूरा करने के लिए, मैंने नीचे दिया गया कोड लिखा है और यह पूरी तरह से अच्छी तरह से काम करता है।

df['adj-time'] = df['time'].apply(lambda x: '{0:0>4}'.format(x))
df['adj-time'] = df['adj-time'].apply(lambda x: pd.to_datetime(x,format= '%H%M'))
df['hour'] = df['adj-time'].apply(lambda x: x.hour)
df.drop('adj-time',axis=1, inplace=True)

नीचे मेरा वांछित आउटपुट है

+-----------+------+--------------+------+
| invoiceNo | time | invoiceValue | hour |
+-----------+------+--------------+------+
|     A     |   6  |       2      |   0  |
+-----------+------+--------------+------+
|     B     |  12  |       3      |   0  |
+-----------+------+--------------+------+
|     C     |  356 |       5      |   3  |
+-----------+------+--------------+------+
|     D     | 2145 |       6      |  21  |
+-----------+------+--------------+------+

हालांकि, मेरा सवाल यह है कि जब बड़े डेटा सेट की बात आती है तो उपरोक्त कोड very very slow और time consuming है।

प्रदर्शन/गति के मामले में मैं इसे और अधिक कुशल कैसे बना सकता हूं?

1
Tommy 10 सितंबर 2020, 22:48

3 जवाब

सबसे बढ़िया उत्तर

घंटे निकालने के लिए स्ट्रिंग हेरफेर का प्रयोग करें। zfill अधिकतम 4 वर्ण (6 यदि आपके पास सेकंड भी हैं) और फिर घंटे प्राप्त करने के लिए पहले 2 को स्लाइस करें ([२:४] मिनटों के लिए और [४:६] सेकंड के लिए)। संख्यात्मक प्रकार प्राप्त करने के लिए pd.to_numeric का प्रयोग करें।

df['hour'] = pd.to_numeric(df['time'].astype(str).str.zfill(4).str[0:2])
df['minutes'] = pd.to_numeric(df['time'].astype(str).str.zfill(4).str[2:4])

  invoiceNo  time  invoiceValue  hour  minutes
0         A     6             2     0        6
1         B    12             3     0       12
2         C   356             5     3       56
3         D  2145             6    21       45

यदि आप अपने 'time' को एक timedelta64[ns] प्रकार में बदलने में रुचि रखते हैं तो आप pd.to_datetime के लचीले पार्सिंग का उपयोग कर सकते हैं। क्योंकि वर्ष/महीना/दिन गायब है, यह 1900-01-01 के लिए डिफ़ॉल्ट है, जिसे हम घटाते हैं।

df['new_time'] = (pd.to_datetime(df['time'].astype(str).str.zfill(4), format='%H%M')
                  - pd.to_datetime('1900-01-01'))

  invoiceNo  time  invoiceValue  hour  minutes        new_time
0         A     6             2     0        6 0 days 00:06:00
1         B    12             3     0       12 0 days 00:12:00
2         C   356             5     3       56 0 days 03:56:00
3         D  2145             6    21       45 0 days 21:45:00
2
ALollz 10 सितंबर 2020, 23:04
  • zfill का भी उपयोग कर रहे हैं
  • 'time' को एक स्ट्रिंग के रूप में सेट करें, डेटाटाइम में कनवर्ट करें और घंटा घटक निकालें।
df['hour'] = pd.to_datetime(df.time.astype('str').str.zfill(4), format='%H%M').dt.hour

# display(df)
  invoiceNo  time  invoiceValue  hour
0         A     6             2     0
1         B    12             3     0
2         C   356             5     3
3         D  2145             6    21

Csv . से पढ़ें

  • डेटा को पढ़ते समय 'time' कॉलम का प्रकार सेट करें और फिर .astype('str') की आवश्यकता नहीं है।
df = pd.read_csv('test.csv', dtype={'time': str})
df['hour'] = pd.to_datetime(df.time.str.zfill(4), format='%H%M').dt.hour

timeit परीक्षण

# 2M rows of data
df = pd.DataFrame({'time':[6,12,356,2145]})
dft = pd.concat([df] * 500000).reset_index(drop=True)

%%timeit
pd.to_datetime(dft.time.astype('str').str.zfill(4), format='%H%M').dt.hour
[out]:
1.51 s ± 23.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
pd.to_numeric(dft.time.astype(str).str.zfill(4).str[0:2])
[out]:
2.6 s ± 41.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
1
Trenton McKinney 10 सितंबर 2020, 23:58

यदि आपका समय पूर्णांक है तो:

hour = int(time/100)

अगर यह स्ट्रिंग है:

hour = int(int(time)/100)
1
gtomer 10 सितंबर 2020, 22:55