1. 问题起源 1.1. 微博发布时间有很多格式,不统一就没法做进一步数据分析 那么,对微博评论采集结果进行格式化或其它数据预处理的时候怎样同意转换时间格式?在Jupyter Notebook下使用python进行处理的方法是怎样的? 微博目前是研究社会舆情和人群特征的重要数据源,很多毕业设计论文是在挖掘微博内容后写成的,有同学使用集搜客微博采集工具箱中的微博评论采集工具采集了很多微博评论: 看到的采集结果像下图 很多同学在得到这个数据结果后,导入GooSeeker分词和文本分析软件对文本内容进行初步加工,然后可以建立多种分析模型,比如计算相似度、进行分类或者聚类、做回归计算、基于共现词做图分析和度分析等等。上图可以看到,要把发布时间作为一个分析维度,原始格式的时间显然不行。采集到的发布时间原始数据有如下几种格式:
希望统一成如下样例格式: 2022-03-31 15:59 那么,从集搜客采集工具或者GooSeeker分词工具导出结果以后,在进一步量化分析之前,有必要对数据的某些字段进行格式化处理。下面我们专门讲一下用python对时间进行同一个格式化。 1.2. 使用什么工具进行这些数据预处理? python下有很多功能强大的内置库和第三方库,可以借助这些工具进行各种数据的处理,比如:文本,时间日期,数字等。 我们今天使用的Pandas是一个很好用的工具。Pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 是Python数据分析实践与实战的必备高级工具。 Pandas 适用于处理以下类型的数据:
在前一周的notebook中,我们对GooSeeker网络爬虫软件采集到的商品参数结构,在notebook中使用Pandas做多个数据表的合并。从那里可以体会到使用notebook的特点:第一,可以交互式探索;第二,探索过程自然而然地记录在notebook中。 本notebook依然聚焦于Pandas的使用,减少python的代码量,我们依然直接读取GooSeeker网络爬虫软件采集到的微博评论结果表,看看怎样转化时间格式。 1.3. 本模板适应的场景 本模板根据GooSeeker网络爬虫软件采集到的微博评论结果,在python中使用Pandas打开excel表,进行时间字段的处理,然后将处理后的结果保存到结果目录。 1.4. 使用方法 基本操作顺序是:
注意:每个notebook项目目录都预先规划好了,具体参看Jupyter Notebook项目目录规划参考。如果要做多个分析项目,把整个模板目录专门拷贝一份给每个分析项目。 1.5. 简要技术说明 在每个功能项单元,如果不需要关心的编程细节,将注明【编程细节】。 本notebook主要实现以下几个步骤:
2. 运行环境的搭建 如何快速搭建运行本Notebook需要的环境?最简单的方法是下载安装Anaconda,这是一个python集成环境,常用的库都配套好了。 3. 数据源 数据源是微博采集工具箱的微博评论采集工具采集的微博评论数据。供参考和实验。 4. 修改历史 2022-06-17:第一版发布 5. 版权说明 本notebook是GooSeeker大数据分析团队开发的,所分析的源数据是微博采集工具箱的微博评论采集工具采集的,本notebook中的数据和代码可自由共享使用,包括转发、复制、修改、用于其他项目中。 6. 准备程序环境 导入必要的Python程序包,设定要分析的文件名变量。使用以下变量对应GooSeeker采集到的微博评论表:
【编程细节】本节下面的代码将对上述微博评论表名变量赋值 import pandas as pd import os import datetime import re %xmode Verbose import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) # 存原始数据的目录 raw_data_dir = os.path.join(os.getcwd(), '../../data/raw') # 存处理后的数据的目录 processed_data_dir = os.path.join(os.getcwd(), '../../data/processed') filename_temp = pd.Series(['微博评论']) file_weibo_com = '' 结果输出如下: Exception reporting mode: Verbose 7. 检测data\raw目录下是否有分词效果表 # 0:'微博评论' print(raw_data_dir + '\r\n') for item_filename in os.listdir(raw_data_dir): if filename_temp[0] in item_filename: file_weibo_com = item_filename continue if file_weibo_com: print("微博评论excel表:", "data/raw/", file_weibo_com) else: print("微博评论excel表:不存在") 结果输出如下: C:\Users\work\workspace_219\notebook\微博评论采集下来后怎样把发布时间转换成统一格式_20220617\notebook\eda\../../data/raw 微博评论excel表: data/raw/ 微博评论采集结果_20220617110653802.xlsx 8. 读取微博评论表 以下的演示以微博采集工具箱的微博评论采集工具采集的微博评论数据excel表为例,需要把excel表放到本notebook的data/raw文件夹下 df = pd.read_excel(os.path.join(raw_data_dir, file_weibo_com)) 8.1. 查看excel表的前5行 df.head(5) 8.2. 在dataframe最右边新增一列“发布时间_new” df["发布时间_new"] = '' 8.3. 格式化“发布时间”并写入“发布时间_new” 读取datafram的每一行,按不同的格式进行不同的处理,处理后的结果写入“发布时间_new”这一列 df_output = df for idx, row in df.iterrows(): # 从源数据表读出来需要的字段 # 读源数据表的时候,采用了序号方式:idx v_createdate = df.iloc[idx][' v_createdate_date = datetime.datetime.strptime(v_createdate,"%Y-%m-%d %H:%M:%S") v_pub_date = df.iloc[idx]['发布时间'].split('来自')[0].strip() # 格式1:35秒前 if re.search('\d{1,2}秒前', v_pub_date): v_pubdate_new = v_createdate_date - datetime.timedelta(seconds = int(v_pub_date.split('秒前')[0])) # 格式2:5分钟前 elif re.search('\d{1,2}分钟前', v_pub_date): v_pubdate_new = v_createdate_date - datetime.timedelta(minutes = int(v_pub_date.split('分钟前')[0])) # 格式3:6小时前 elif re.search('\d{1,2}小时前', v_pub_date): v_pubdate_new = v_createdate_date - datetime.timedelta(hours = int(v_pub_date.split('小时前')[0])) # 格式4:今天 09:31 elif re.search('今天 \d{1,2}:\d{1,2}', v_pub_date): v_year = int(v_createdate[0:4]) v_month = int(v_createdate[5:7]) v_day = int(v_createdate[8:10]) v_hour = int(v_pub_date.split(' ')[1][0:2]) v_minute = int(v_pub_date.split(' ')[1].split(':')[1]) v_pubdate_new = datetime.datetime(year=v_year,month=v_month,day=v_day,hour=v_hour,minute=v_minute,second=0) # 格式5:6月16日 17:24 elif re.search('\d{1,2}月\d{1,2}日 \d{1,2}:\d{1,2}', v_pub_date): v_year = int(v_createdate[0:4]) v_month = int(v_pub_date.split('月')[0]) v_day = int(v_pub_date.split('月')[1].split('日')[0]) v_hour = int(v_pub_date.split(' ')[1].split(':')[0]) v_minute = int(v_pub_date.split(' ')[1].split(':')[1]) v_pubdate_new = datetime.datetime(year=v_year,month=v_month,day=v_day,hour=v_hour,minute=v_minute,second=0) # 格式6:2021-12-31 23:15 elif re.search('\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}', v_pub_date): v_pub_date = v_pub_date[0:16] v_pubdate_new = datetime.datetime.strptime(v_pub_date, "%Y-%m-%d %H:%M") # 更新“发布时间_new”的值 df_output.loc[idx,'发布时间_new'] = v_pubdate_new #print(df_output.loc[idx,'发布时间_new']) 8.4. 显示更新后的dataframe的前5行 拉动滚动条到最右边,可以看到“发布时间_new”这一列的值已经填充为标准时间格式 df_output.head(5) 8.5. 把处理后的dataframe保存到processed目录下 file_weibo_com_output = 'output_' + file_weibo_com df_output.to_excel(os.path.join(processed_data_dir, file_weibo_com_output), sheet_name='sheet1') 9. 下载本notebook 下载源代码请进:以微博评论采集为例将发布时间转换成统一格式 |