day-18作业(2022.05.08)

该博客主要介绍了三个数据处理任务。首先,根据行政区对酒店数据进行分类,然后在落户积分文件中添加了新生日、年龄和星座信息,并计算了平均年龄。最后,根据星座对数据进行了分类存档。这些操作涉及到文件读写、日期运算、正则表达式和条件判断等技术。
摘要由CSDN通过智能技术生成

day-18作业(2022.05.08)

1. 作业1:按行政区对酒店进行分类

import os
import csv
original_path = r'./files/北京高档酒店价格分析.csv'
storage_path = r'./task01'

def classification(path,file):
    """
    酒店分类
    :param path: 储存文件路径
    :param file: 原始csv文件
    :return:
    """
    hotel_data = list(csv.reader(open(file, 'r', encoding='utf-8', newline='')))
    for i in hotel_data[1:]:
        fi = f'{path}/{i[1]}.csv'
        writer = csv.writer(open(fi, 'a', encoding='utf-8', newline=''))
        # 返回文件字节,返回0表示为空False,不为0则为True
        if os.path.getsize(fi):
            writer.writerow(i)
        else:
            writer.writerow(hotel_data[0])
            writer.writerow(i)
            
            
if __name__ == '__main__':
    classification(storage_path,original_path)

2. 作业2:基于落户积分文件

1)添加新生日、年龄、星座
import os
import csv
import random
import re
from datetime import datetime

# 是否闰年
is_leap_year = lambda year: (year % 4 == 0 and year % 100 != 0) or (year % 400 ==0)

def random_day(path, file):
    """
    添加新生日、年龄、星座
    :param path: 储存路径
    :param file: csv文件
    :return:
    """
    data = list(csv.DictReader(open(file, 'r', encoding='utf-8', newline='')))
    for i in data:
        # 添加新生日
        year = int((re.findall(r'(\d{4})-',i['birthday']))[0])
        month = int((re.findall(r'-(\d.?)',i['birthday']))[0])
        if month in (1,3,5,7,8,10,12):
            i['new_birthday'] = str(i['birthday']) + '-' + str(random.randint(1, 31))
        elif month in (4,6,9,11):
            i['new_birthday'] = str(i['birthday']) + '-' + str(random.randint(1, 30))
        else:
            if is_leap_year(year):
                i['new_birthday'] = str(i['birthday']) + '-' + str(random.randint(1, 29))
            else:
                i['new_birthday'] = str(i['birthday']) + '-' + str(random.randint(1, 28))
        i['new_birthday'] = datetime.strptime(i['new_birthday'],'%Y-%m-%d')

        # 添加年龄
        age = datetime.now() - i['new_birthday']
        i['age'] = age.days//365

        # 添加星座
        strtime = i['new_birthday'].strftime("%m%d")  #将datetime类型的时间转化为字符串
        if int(strtime) in range(321,420):
            i['constellation'] = '白羊座'
        elif int(strtime) in range(420,521):
            i['constellation'] = '金牛座'
        elif int(strtime) in range(521,622):
            i['constellation'] = '双子座'
        elif int(strtime) in range(622,723):
            i['constellation'] = '巨蟹座'
        elif int(strtime) in range(723,823):
            i['constellation'] = '狮子座'
        elif int(strtime) in range(823,923):
            i['constellation'] = '处女座'
        elif int(strtime) in range(923,1024):
            i['constellation'] = '天秤座'
        elif int(strtime) in range(1024,1123):
            i['constellation'] = '天蝎座'
        elif int(strtime) in range(1123,1222):
            i['constellation'] = '射手座'
        elif int(strtime) in (range(1222,1232) or range(101,120)):
            i['constellation'] = '摩羯座'
        elif int(strtime) in range(120,219):
            i['constellation'] = '水瓶座'
        else: # int(strtime) in range(219,321):
            i['constellation'] = '双鱼座'

        # 写入文件
        file = f'{path}/new_birthday.csv'

        writer = csv.DictWriter(open(file,'a',encoding='utf-8', newline=''),
                                list(i))
        if os.path.getsize(file):
            writer.writerow(i)
        else:
            writer.writeheader()
            writer.writerow(i)

if __name__ == '__main__':
    storage_path = r'./task02'
    original_path = r'./files/2018年北京积分落户数据.csv'
    
    # 添加新生日、年龄、星座
    random_day(storage_path, original_path)
2)计算平均年龄
file1 = r'./task02/new_birthday.csv'
def avg_age(file):
    """
    计算平均年龄
    :param file: csv文件
    :return:
    """
    data = list(csv.reader(open(file, 'r', encoding='utf-8',newline='')))
    age = [int(i[6]) for i in data[1:]]
    return f'{(sum(age) / len(age)):.2f}'

if __name__ == '__main__':
	file1 = r'./task02/new_birthday.csv'
	
	# 计算平均年龄
    print(avg_age(file1))
3)星座分类
file1 = r'./task02/new_birthday.csv'
def constellation(path, file):
    """
    星座分类
    :param path: 文件保存路径
    :param file: 原csv文件
    :return:
    """
    data = list(csv.reader(open(file, 'r', encoding='utf-8', newline='')))
    for i in data[1:]:
        fi = f'{path}/{i[len(i)-1]}.csv'
        writer = csv.writer(open(fi, 'a', encoding='utf-8', newline=''))
        if os.path.getsize(fi):
            writer.writerow(i)
        else:
            writer.writerow(data[0])
            writer.writerow(i)

if __name__ == '__main__':
	storage_path = r'./task02'
    file1 = r'./task02/new_birthday.csv'
    
    # 星座分类
    constellation(storage_path,file1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值