Разделение строки на цифры и буквы в python - PullRequest
2 голосов
/ 25 апреля 2020

Я начал учиться python два дня go. Сегодня я создал скрипт веб-проверки, который извлекает данные из финансов Yahoo и помещает их в файл CSV. У меня проблема в том, что некоторые значения являются строковыми, потому что финансы Yahoo отображают их как таковые.

Например: Доход: 806,43M

Когда я копирую их в CSV, я не могу использовать их для расчета, поэтому мне было интересно, возможно ли разделить "806.43" и "M" сохраняя оба, чтобы увидеть единицу числа и поместить их в два разных столбца.

для написания в Excel. Я использую эту команду:

f.write(revenue + "," + revenue_value + "\n")

, где:

print(revenue)
Revenue (ttm)
print(revenue_value)
806.43M

, поэтому в конце я смогу использовать команду, которая выглядит что-то как это

f.write(revenue + "," + revenue_value + "," + revenue_unit + "\n")

, где выручка равна 806,43, а доходная единица равна M

Надеюсь, что кто-то может помочь с этой проблемой.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Я полагаю, что самый простой способ - это проанализировать число как строку и преобразовать его в число с плавающей точкой на основе единицы измерения в конце строки.


Следующие действия должны помочь:

def parse_number(number_str) -> float:
    mapping = {
        "K": 1000,
        "M": 1000000,
        "B": 1000000000
    }

    unit = number_str[-1]
    number_float = float(number_str[:-1])

    return number_float * mapping[unit]

А вот пример:

my_number = "806.43M"
print(parse_number(my_number))
>>> 806430000.0
0 голосов
/ 25 апреля 2020

Вы всегда можете попробовать регулярные выражения .

Вот довольно хороший онлайн-инструмент, позволяющий вам практиковаться в использовании Python -specifi c стандартов.

import re

sample = "Revenue (ttm): 806.43M"

# Note: the `(?P<name here>)` section is a named group. That way we can identify what we want to capture.
financials_pattern = r'''
    (?P<category>.+?):?\s+?     # Capture everything up until the colon
    (?P<value>[\d\.]+)          # Capture only numeric values and decimal points
    (?P<unit>[\w]*)?            # Capture a trailing unit type (M, MM, etc.)
'''

# Flags:
#     re.I -> Ignore character case (upper vs lower)
#     re.X -> Allows for 'verbose' pattern construction, as seen above
res = re.search(financials_pattern, sample, flags = re.I | re.X)

Распечатать наш словарь значений:

res.groupdict()

Вывод:

{'category': 'Revenue (ttm)',
'value': '806.43',
'unit': 'M'}

Мы также можем использовать .groups () для вывода результатов в кортеже.

res.groups()

Вывод:

('Revenue (ttm)', '806.43', 'M')

В этом случае мы сразу распаковываем эти результаты в имена переменных.

revenue = None # If this is None after trying to set it, don't print anything.

revenue, revenue_value, revenue_unit = res.groups()

Мы будем использовать fancy f -строки для распечатки вашего звонка f.write() вместе с полученными результатами.

if revenue:
    print(f'f.write(revenue + "," + revenue_value + "," + revenue_unit + "\\n")\n')
    print(f'f.write("{revenue}" + "," + "{revenue_value}" + "," + "{revenue_unit}" + "\\n")')

Вывод:

f.write(revenue + "," + revenue_value + "," + revenue_unit + "\n")

f.write("Revenue (ttm)" + "," + "806.43" + "," + "M" + "\n")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...