在数字范围内四舍五入数字

时间:2018-06-20 13:37:46

标签: python python-3.x data-cleaning

我试图弄清楚如何处理我收到的数字范围的变化。我从一个数据帧中编译了它们,并试图以100-200 / 200-300 / 300-400格式获取所有范围。

有时它们将被输入为300.400,而不是300-400,有时它们将被输入为300.5-400.5。如果可能的话,我还要考虑一下将它们输入为300.5.400.5的情况,因为有人可能会这样做,因为它是如此的疯狂。我想我可能应该尝试计划在它们之间没有出现“-”的任何字符。

要精简起见,我想用小数点后的数字四舍五入,并用非“-”字符分隔范围,而不用小数点代替句点。

不好意思,我的代码:

num_range = [p.replace(' ', '') for p in num_dirty]
num_range = [p.replace(';', ' ') for p in num_dirty]
num_range = [p.replace('.', '-') for p in num_dirty]

num_clean = []

for r in num_dirty:
    num_clean.append(r.split('/'))

num_clean = list(itertools.chain.from_iterable(num_clean))

num_clean = ','.join(num_clean)

我还使用在这里找到的此功能列出了频率范围内的所有数字,以便删除任何重复的范围:

num_lines = num_clean.split(',')
num_numbers = []
i = 0
for line in num_lines:
    if line == '':
        continue
    elif '-' in line:
        t = line.split('-')
        num_numbers += range(int(t[0]), int(t[1]) + 1)
    else:
        num_numbers.append(int(line))

谢谢!

1 个答案:

答案 0 :(得分:0)

我在您帖子的前两段中运行了以下正则表达式

import re
from math import ceil

pat = re.compile(r'(\d+(?:\.\d+)?)\D(\d+(?:\.\d+)?)')
l = [(ceil(float(a)), ceil(float(b))) for a, b in pat.findall(your_post)]
print(l)
# [(100, 200), (200, 300), (300, 400), (300, 400), (300, 400), (301, 401), (301, 401)]

您可以根据需要从那里生成格式化的字符串

for pair in l:
    print("{}-{}".format(*pair))