我有一個 df 和一個字串列,如下所示:
runtime
1h 38m
20h 4m
5h
45m
empty
我正在嘗試應用一個將其轉換為分鐘的函式。
到目前為止,我已經想出了一部分:
def runtime_to_minutes(string):
try:
capt_numbers = re.compile(r'[\d ][\d ]')
hours = int(re.findall(capt_numbers, string)[0])
minutes = int(re.findall(capt_numbers, string)[1])
duration = hours * 60 minutes
return duration
except Exception as error:
return str(error)
這顯然無法處理所有情況,盡管它不適用于“1h 38m”,因為我list index out of range在執行以下操作時遇到錯誤:df['minutes'] = df['runtime'].apply(lambda s: runtime_to_minutes(s))
我應該如何重組正則運算式和函式以獲得所需的結果?
uj5u.com熱心網友回復:
您可以使用
import pandas as pd
df = pd.DataFrame({'runtime':['1h 38m','20h 4m','5h','45m','empty']})
df[['hours', 'minutes']] = df['runtime'].str.extract(r'(?=\d \s*[hm]\b)(?:(\d )\s*h)?(?:\s*(\d )\s*m)?').fillna(0)
df['minutes'] = df['hours'].astype(int) * 60 df['minutes'].astype(int)
df.drop('hours', axis=1, inplace=True)
# => df
# runtime minutes
# 0 1h 38m 98
# 1 20h 4m 1204
# 2 5h 300
# 3 45m 45
# 4 empty 0
請參閱正則運算式演示。該模式提取兩個捕獲,小時和分鐘。兩個部分都是可選的,但前瞻確保至少存在一個部分。
(?=\d \s*[hm]\b)- 一個正向前瞻,需要一個或多個數字、零個或多個空格,然后跟h或m不跟任何其他單詞 char(?:(\d )\s*h)?- 一個可選的非捕獲組將一個或多個數字捕獲到組 1 中,然后只匹配零個或多個空格和h(?:\s*(\d )\s*m)?- 一個可選的非捕獲組匹配零個或多個空格,然后捕獲一個或多個數字到組 2,然后m匹配零個或多個空格。
如果沒有匹配發生,則.fillna(0)放置0為默認值。
小時和分鐘保存在hours和minutes列中。
然后,計算分鐘并hours洗掉列。
uj5u.com熱心網友回復:
def runtime_to_minutes(string):
duration = 0
capt_numbers = re.compile(r'(\d )\s*h')
try:
hours = int(re.findall(capt_numbers, string)[0])
except:
hours=0
capt_numbers = re.compile(r'(\d )\s*m')
try:
minutes = int(re.findall(capt_numbers, string)[0])
except:
minutes = 0
duration = int(hours) * 60 int(minutes)
return duration
liste = [' 1h 38m',
' 20h 4m',
' 5h',
' 45m', 'empty']
for li in liste:
time = runtime_to_minutes(li)
print(time)
Results:
98
1204
300
45
0
我稍微改變了你的功能,現在一切正常。我使用了 2 個 try/except 塊并將數字設定為零以防出現例外!
我忘了補充:
它也適用于熊貓:
df = pd.DataFrame(liste)
df.columns = ['time']
df['time_2'] = df.time.apply(runtime_to_minutes)
time time_2
0 1h 38m 98
1 20h 4m 1204
2 5h 300
3 45m 45
4 empty 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/347562.html
