写点什么

使用 Python 分析 Google Calender 日程

用户头像
Roc
关注
发布于: 2020 年 05 月 27 日
使用 Python 分析 Google Calender 日程

1. 缘起

制作 2019 年终工作总结 PPT 的时候想放入一些统计图,例如本年度参与的会议种类及数目。由于平时使用 Google Calender 安排日程,所以尝试从中分析。

2. 过程

2.1 直接搜索

第一个想法是搜索相关关键字,但是手动统计太麻烦了。

搜索“会议”日程

2.2 导出数据

在查看 Google Calender 的设置的时候,发现能够导出数据。

Google Calender 导出日程



导出的文件是一个以 Google 账号使用的邮箱命名的 ZIP 压缩包,在上面选择导出了几个日历,这里就会有几个 ics 后缀的文件。直接打开 ics 文件的话,会唤起 Win 10 的邮件应用中执行日历导入操作(需要确认)。

导出的日历文件



直接用文本编辑器打开 ics 文件,会发现里面都是格式化的文本,包含使用 Google Calender 以来的全部数据。

ics 文件内容

2.3 分析数据

分析记录,尝试找出规律。发现近期的记录基本都是这样的格式:

BEGIN:VEVENT
DTSTART:20181126T013000Z
DTEND:20181126T023000Z
DTSTAMP:20200105T011844Z
UID:0rm22n1nkgdibuhfao2mij324p@google.com
CREATED:20181122T064618Z
DESCRIPTION:
LAST-MODIFIED:20181122T064658Z
LOCATION:xx室
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:xxx需求评审
TRANSP:OPAQUE
END:VEVENT

更早的日历事件的字段会有差别(应该是更新过数据结构),但是我只需要 2019 年的,所以不需要关心。

根据我的需求,我只需要提取出这三个字段的内容即可:

  • DTSTART 事件开始时间

  • LOCATION 事件地点

  • SUMMARY 事件标题

2.4 提取记录

使用 Python 提取数据,用到的代码如下:

import re
#正则模式
#单个事件记录
event_pattern=re.compile(r'^BEGIN:VEVEN.*?END:VEVENT$',re.MULTILINE|re.DOTALL)
#2019 年的起始时间
start_2019_pattern=re.compile(r'^DTSTART:2019.*?$',re.MULTILINE)
#提取起始时间
start_pattern=re.compile(r'^DTSTART:(?P<start>.+?)$',re.MULTILINE)
#提取标题
summary_pattern=re.compile(r'^SUMMARY:(?P<summary>.+?)$',re.MULTILINE)
#提取地点
location_pattern=re.compile(r'^LOCATION:(?P<location>.+?)$',re.MULTILINE)
#屏蔽的关键词,多次执行程序,逐步完善
block_summary = ['做饭','健身','钢琴','理财','制定周计划','聚餐','洗牙','电影','航班','生日','跑步','火车','加班','理发']
#处理事件
def deal_event(i,file):
    #提取起始时间为2019年的记录
    start2019Result = start_2019_pattern.findall(i)
    if len(start2019Result):
        #该事件属于2019年
        #提取开始时间
        startResult = start_pattern.search(i).group('start')
        #提取标题
        summaryResult = summary_pattern.search(i).group('summary')
        #提取地点
        locationSearchResult = location_pattern.search(i)
        locationResult = ''
        if locationSearchResult:
            #提出出了地点
            locationResult = locationSearchResult.group('location')
        #标记是否需要屏蔽这个事件(与工作无关)
        is_block = 0
        for block in block_summary:
            if block in summaryResult:
                is_block = 1
        if not is_block:
            #不屏蔽、想要的事件
            #写入结果文件
            file.write(startResult+','+locationResult+','+summaryResult)
            file.write('\n')
#导出的日历数据文件,保存成 txt 格式文件
calenderFile = open('./2019-GoogleCalender.txt')
#文件数据
calenderString = calenderFile.read()
#提取事件列表
extractEventList = event_pattern.findall(calenderString)
#保存的文件
filterEvent = open('./filterEvent.txt','w')
for event in  extractEventList:
    deal_event(event,filterEvent)



唯一的难点在于多行文本的正则提取



提取的结果格式如下:

20190716T080000Z,xx会议室,xxx会议
20190716T080000Z,,xxx会议



由于安排日程的时候比较随意,命名不规范,所以无法做到完整的分类统计,这次只能先人工分类统计。

3. 后续计划

1. 制定日程名称规范,例如参考 tagLyst 使用“#”在标题中标记标签,便于之后的统计。

2. 在 Google Calender 中建立其他日历,将工作和生活分开记录。

3. 完善代码:

  • 直接使用 Python 生成统计图。

  • ……



发布于: 2020 年 05 月 27 日阅读数: 48
用户头像

Roc

关注

还未添加个人签名 2018.10.17 加入

还未添加个人简介

评论

发布
暂无评论
使用 Python 分析 Google Calender 日程