12.16

大数据清洗数据如下import re
from datetime import datetime

中国主要城市列表

chinese_cities = [
'北京市', '上海市', '广州市', '深圳市', '杭州市', '南京市', '武汉市', '成都市',
'重庆市', '西安市', '天津市', '苏州市', '郑州市', '长沙市', '沈阳市', '济南市',
'青岛市', '大连市', '宁波市', '无锡市', '福州市', '厦门市', '哈尔滨市', '长春市',
'石家庄市', '太原市', '合肥市', '南昌市', '南宁市', '昆明市', '贵阳市', '兰州市',
'西宁市', '银川市', '乌鲁木齐市', '呼和浩特市', '拉萨市', '香港特别行政区', '澳门特别行政区',
'台湾省台北市', '台湾省高雄市', '台湾省台中市', '台湾省台南市', '台湾省新竹市'
]

模拟IP地址到中文城市的映射(扩展版本,包含常见IP地址)

ip_city_map = {
'106.39.41.166': '北京市',
'183.162.52.7': '上海市',
'10.100.134.244': '广州市',
'116.77.239.141': '深圳市',
'115.193.172.253': '杭州市',
'117.173.0.113': '南京市',
'58.20.14.170': '武汉市',
'199.30.25.88': '成都市',
'106.37.127.231': '重庆市',
'119.131.143.179': '西安市',
'183.39.154.199': '天津市',
'58.241.76.18': '苏州市',
'220.191.6.44': '郑州市',
'39.186.247.142': '长沙市',
'123.125.71.36': '沈阳市',
'114.80.113.189': '济南市',
'124.235.136.186': '青岛市',
'218.60.115.153': '大连市',
'182.254.144.139': '宁波市',
'221.230.154.183': '无锡市',
# 新增常见IP映射
'114.248.224.214': '北京市',
'117.100.231.8': '上海市',
'122.71.75.164': '广州市',
'58.217.142.142': '深圳市',
'113.143.158.241': '杭州市',
'202.119.41.28': '南京市',
'125.119.38.58': '武汉市',
'182.138.128.41': '成都市',
'120.198.231.151': '重庆市',
'112.10.27.228': '西安市',
'182.100.43.246': '天津市',
'101.38.157.182': '苏州市',
'115.174.68.92': '郑州市',
'125.81.90.200': '长沙市',
'116.213.171.153': '沈阳市',
'140.205.253.135': '济南市',
'58.48.139.85': '青岛市',
'183.45.18.241': '大连市',
'112.16.92.55': '宁波市',
'222.35.76.74': '无锡市'
}

IP地址转换为中文城市函数

def ip_to_city(ip):
# 如果IP在映射表中,返回对应的城市名称
if ip in ip_city_map:
return ip_city_map[ip]
# 否则返回None,表示未知城市
return None

日期格式转换函数

def convert_date_format(date_str):
# 原始格式: 10/Nov/2016:00:01:02 +0800
# 目标格式: 2016-11-10 00:01:02
try:
dt = datetime.strptime(date_str, "%d/%b/%Y:%H:%M:%S %z")
return dt.strftime("%Y-%m-%d %H:%M:%S")
except Exception as e:
print(f"日期转换错误: {e}, 原始日期: {date_str}")
return date_str

主函数

def main():
input_file = "result.txt"
output_file = "cleaned_data.txt"

f_in = open(input_file, 'r', encoding='utf-8')
f_out = open(output_file, 'w', encoding='utf-8')

line_count = 0
kept_count = 0
dropped_count = 0

for line in f_in:
    line_count += 1
    # 去除行首的行号和箭头 (如 "1→"), 然后分割数据
    line = line.strip()
    if line:
        # 移除行号前缀
        if '→' in line:
            line = line.split('→', 1)[1]
        
        # 按逗号分割字段
        fields = line.split(',')
        if len(fields) == 6:
            ip = fields[0].strip()
            date_str = fields[1].strip()
            day = fields[2].strip()
            traffic = fields[3].strip()
            type_ = fields[4].strip()
            id_ = fields[5].strip()
            
            # 转换日期格式
            converted_date = convert_date_format(date_str)
            
            # 将IP地址转换为中文城市
            city = ip_to_city(ip)
            
            # 只保留已知城市的数据
            if city is not None:
                # 构建清洗后的数据行 (使用制表符分隔,适合Hive导入)
                cleaned_line = f"{city}\t{converted_date}\t{day}\t{traffic}\t{type_}\t{id_}\n"
                f_out.write(cleaned_line)
                kept_count += 1
            else:
                dropped_count += 1
        else:
            print(f"第 {line_count} 行字段数量错误: {line}")
            dropped_count += 1

f_in.close()
f_out.close()

print(f"数据清洗完成!")
print(f"输入文件总行数: {line_count}")
print(f"保留已知城市行数: {kept_count}")
print(f"剔除未知城市行数: {dropped_count}")
print(f"清洗后文件: {output_file}")

if name == "main":
main()

posted @ 2025-12-16 23:47  山蚯  阅读(3)  评论(0)    收藏  举报