Python: усечение строки и объединение - PullRequest
0 голосов
/ 08 ноября 2018

Чего я хочу достичь

Мой код ниже очищает веб-сайт и экспортирует фрейм данных в файл Excel. Однако мне нужно удалить ненужные символы из первого столбца и объединить их, чтобы мне не нужно было переименовывать месяцы в файле Excel. У каждой строки есть обозначение с веб-сайта HOZ18 (декабрь 2018 года) 'HOZ19 (декабрь 2019 года), которое меня не интересует в дополнение к "\". Итак, я просто хочу 18 декабря, 19 января, 20 февраля и т. Д. В первом столбце.

код

    from urllib.request import urlopen
    import pandas as pd
    import requests
    from bs4 import BeautifulSoup

    url = "https://shared.websol.barchart.com/quotes/quote.php?page=quote&sym=ho&x=13&y=8&domain=if&display_ice=1&enabled_ice_exchanges=&tz=0&ed=0"

    res = requests.get(url)

    soup = BeautifulSoup(res.text, 'lxml')

    Contracts=[]
    LastPrice=[]


    data_rows = soup.findAll('tr')[2:]

    for td in data_rows:
       Contract = td.findAll('td')[0].text
       Contracts.append(Contract)
       LstPrice = td.findAll('td')[7].text
       LastPrice.append(LstPrice)

   df = pd.DataFrame({'Contracts': Contracts, 'Previous Settled': LastPrice})

Выход (только частичный)

  0     Cash (HOY00)    2.1884
  1     Dec \'18 (HOZ18)    2.2371
  2     Jan \'19 (HOF19)    2.2238
  3     Feb \'19 (HOG19)    2.2125

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вот опция, которая не требует .apply().Предполагается, что мы имеем дело с годами в 21-м веке, но не уверены, что это сработает для вас.И он также хранит месяц как число, что может быть полезно, если вы не можете удалить этот бит.

import pandas as pd
import re
import datetime

# Data setup.

data = pd.DataFrame(['Dec \'18 (HOZ18)', 'Jan \'19 (HOF19)', 'Feb \'19 (HOG19)'], columns = ['string'])

# Extract the month number using regex, then map it to a month number.

data['month_number'] = [datetime.datetime.strptime(re.sub('\s\'.*', '', i), '%b').month for i in data['string']]

# Extract the year, prepend '20' and store as an integer.

data['year'] = [int('20' + re.search('\d\d', i).group(0)) for i in data['string']]

print(data)

Предоставление:

            string  month_number  year
0  Dec '18 (HOZ18)            12  2018
1  Jan '19 (HOF19)             1  2019
2  Feb '19 (HOG19)             2  2019
0 голосов
/ 08 ноября 2018

Если вы хотите преобразовать строку типа Dec \'18 (HOZ18) в December 18, вот одно из решений.

1) Определите функцию для очистки строк:

# define a dictionary to convert short month names to full ones
month_mapper = {
    'Jan': 'January',
    'Feb': 'February',
    'Mar': 'March',
    'Apr': 'April',
    'May': 'May',
    'Jun': 'June',
    'Jul': 'July',
    'Aug': 'August',
    'Sep': 'September',
    'Oct': 'October',
    'Nov': 'November',
    'Dec': 'December',
}

def clean_month_string(s):
    # replace the '\' char with empty string
    s = s.replace('\\', '')

    # split into three pieces on space
    # eg, "Dec '18 (HOZ18)" ->
    #   month = "Dec"
    #   year = "'18"
    #   code = "(HOZ18)"
    month, year, code = s.split(' ')

    # convert month using month mapper
    month = month_mapper[month]

    # remove the ' at the start of the year
    year = year.replace("'", "")

    # return new month and new year (dropping code)
    return ' '.join([month, year])

2) Примените эту функцию к каждой строке в вашем DataFrame, используя apply.

# drop that first row, which is not properly formatted
df = df.drop(0).reset_index(drop=True)

# apply the function to your 'Contracts' series.
df['Contracts'] = df['Contracts'].apply(clean_month_string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...