Как преобразовать строку даты в числа

#python #pandas #replace #find #re

Вопрос:

У меня есть в качестве входных данных:

 ["3 years 8 months", "10 months", "1 year 10 months", "9 months", " 1 month ", "1 year", "3 years"]
 

Я хочу получить этот результат:

 [3.8, 0.10, 1.10, 0.09, 0.01, 1, 3]
 

Ответ №1:

Вы можете использовать str.split :

 def to_num(s):
   c = {'year':1, 'years':1, 'month':0.01, 'months':0.01}
   return sum(int(s[i])*c[s[i 1]] for i in range(0, len(s), 2))

vals = ["3 years 8 months", "10 months", "1 year 10 months", "9 months", "1 month", "1 year", "3 years"]
result = [to_num(i.split()) for i in vals]
 

Выход:

 [3.08, 0.1, 1.1, 0.09, 0.01, 1, 3]
 

Ответ №2:

Способ 1: используйте re.search

 import re
def date_to_number(x):
    year, month = 0, 0
    if re.search(r'(d*)syear', x):
        year = float(re.search(r'(d*)syear', x).group(1))
    if re.search(r'(d*)smonth', x):
        month = float(re.search(r'(d*)smonth', x).group(1))/100
    return year month

numbers = [date_to_number(i) for i in data]
 

Выход:

 print(numbers)

[3.08, 0.1, 1.1, 0.09, 0.01, 1.0, 3.0]
 

Способ 2: использование extract() у панд

Если ваши данные хранятся во фрейме данных, вы можете попробовать это:

 df = pd.DataFrame(data, columns=['date'])
df['date_to_number'] = (df['date'].str.extract(r'(d*)syear').fillna(0).astype('int') 
                          df['date'].str.extract(r'(d*)smonth').fillna(0).astype('int').divide(100))
 

Выход:
печать(df)

                date  date_to_number
0  3 years 8 months            3.08
1         10 months            0.10
2  1 year 10 months            1.10
3          9 months            0.09
4          1 month             0.01
5            1 year            1.00
6           3 years            3.00