上期,我们用python爬虫实现了对南京地铁每日客流量数据的爬取,详见Python:南京地铁每日客流数据的爬虫实现。本期,我们对爬取后的数据进行相应的处理。
一、Text文档处理
我们把爬取的text文件翻到最后,发现一些不相关的表述,内容不多,我们直接删掉就行,变成这样:
然后,我们用python把日期和客流量给提取出来,具体代码为:
import reimport pandas as pd # 定义一个函数来处理文本文件def process_text_file(file_path): # 用于存储提取的数据 dates = [] numbers = [] # 打开文件 with open(file_path, 'r', encoding='utf-8') as file: for line in file: # 使用正则表达式匹配日期 date_matches = re.findall(r'南京地铁(.*?)客运量', line) dates.extend(date_matches) # 使用正则表达式匹配数字(包括小数) number_matches = re.findall(r'客运量(.*?),其中', line) numbers.extend([float(num) for num in number_matches]) return dates, numbers # 调用函数并传入文件路径file_path = 'data.txt'dates, numbers = process_text_file(file_path) print(len(dates))print(len(numbers)) df=pd.DataFrame({"Dates":dates,"客运量":numbers})df
运行结果为:
1000多条数据,但有个问题,这个Dates栏目里没有年份啊? ,没关系,我们用pandas把年份加上。二、Pandas实战数据处理1. 在日期栏目里加上年份先找到所有1月1日的位置
#定位数据中1月1日的位置df[df['Dates'].str.contains('^1月1日')]
什么?又有新bug,有个里面1月1日以后还加了个“全线网”?,这个留到后面处理,先加上年份,pandas切片处理
#对对应年份的月份加上年份df.loc[:127, 'Dates'] = df.loc[:127, 'Dates'].apply(lambda x: '2024年' + x)df.loc[128:492, 'Dates'] = df.loc[128:492, 'Dates'].apply(lambda x: '2023年' + x)df.loc[493:855, 'Dates'] = df.loc[493:855, 'Dates'].apply(lambda x: '2022年' + x)df.loc[856:, 'Dates'] = df.loc[856:, 'Dates'].apply(lambda x: '2021年' + x) df
把“全线网”、“线网”、空格给去掉:
df['Dates'] = df['Dates'].str.replace(r' ', '', regex=True)df df['Dates'] = df['Dates'].str.replace(r'(线网|全线网)', '', regex=True)
2. 按月份分析一下客流量
首先,我们把df中Dates一栏中的日期变成只有“月”的内容,方便我们用groupby来进行统计
df1=df.copy(deep=True)df1['Dates']=df1['Dates'].str.replace(r'\d+日', '', regex=True)df1
用groupby来进行汇总每月的客流量,并给予新的Dateframe:df_month
df_month=df1.groupby('Dates').sum().reset_index()df_month
3. 找出最大客流量与最小客流量的一天3.1 最大客流量:
df[df['客运量']==df['客运量'].max()]
查了一下,该天为2024年清明节假期。3.2 最小客流量:
df[df['客运量']==df['客运量'].min()]
看了一下新闻,发现2021年7-8月期间,南京处于疫情期间,地铁客运量少是有原因的:
4. 用Matplotlib画图看看每月客流量图首先,我们对日期进行一个简单的处理,按照月份排序
df_month['Dates'] = pd.to_datetime(df_month['Dates'],format='%Y年%m月')df_sorted = df_month.sort_values(by='Dates')df_sorted
画出月度客流量的折线图
import pandas as pdimport matplotlib.pyplot as pltfrom datetime import datetimeimport numpy as np from matplotlib.pyplot import rcParamsrcParams['font.sans-serif'] = ['SimHei']rcParams['axes.unicode_minus'] = False # 绘制折线图plt.figure(figsize=(10,5)) # 设置图表大小plt.plot(np.array(df_sorted['Dates']), np.array(df_sorted['客运量'])) # 绘制折线图 # 设置图表标题和轴标签plt.title('客运量随月度变化')plt.xlabel('月度')plt.ylabel('客运总量') # 设置x轴的刻度标签旋转,以便更好地显示日期plt.xticks(rotation=45) # 显示网格plt.grid(True) # 显示图表plt.tight_layout() # 调整布局plt.show()
三、结语
以上就是我们使用pandas工具对南京地铁数据进行的一个简单的数据处理分析,当然,各位读者,可以通过截取某一年(比如2023年)的数据进行后续分析,也可以单独截取出每一条线路的客流量进行更深入的分析,pandas是一个强大的Python数据分析工具库,大家试着练习起来,天天向上文中的数据文件,我放在了百度网盘中,具体链接如下:
链接: https://pan.baidu.com/s/1xJu2Q9yU4T5h-Dc6s4FAWw 提取码: 8888 复制这段内容后打开百度网盘手机App,操作更方便哦