精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 Jupyter 改善你的時間管理

開發 后端
在 Jupyter 里使用 Python 來分析日歷,以了解你是如何使用時間的。

在 Jupyter 里使用 Python 來分析日歷,以了解你是如何使用時間的。

Python 在探索數據方面具有令人難以置信的可擴展性。利用 Pandas 或 Dask,你可以將 Jupyter 擴展到大數據領域。但是小數據、個人資料、私人數據呢?

JupyterLab 和 Jupyter Notebook 為我提供了一個絕佳的環境,可以讓我審視我的筆記本電腦生活。

我的探索是基于以下事實:我使用的幾乎每個服務都有一個 Web API。我使用了諸多此類服務:待辦事項列表、時間跟蹤器、習慣跟蹤器等。還有一個幾乎每個人都會使用到:日歷。相同的思路也可以應用于其他服務,但是日歷具有一個很酷的功能:幾乎所有 Web 日歷都支持的開放標準 —— CalDAV。

在 Jupyter 中使用 Python 解析日歷

大多數日歷提供了導出為 CalDAV 格式的方法。你可能需要某種身份驗證才能訪問這些私有數據。按照你的服務說明進行操作即可。如何獲得憑據取決于你的服務,但是最終,你應該能夠將這些憑據存儲在文件中。我將我的憑據存儲在根目錄下的一個名為 .caldav 的文件中:

  1. import os
  2. with open(os.path.expanduser("~/.caldav")) as fpin:
  3.     username, password = fpin.read().split()

切勿將用戶名和密碼直接放在 Jupyter Notebook 的筆記本中!它們可能會很容易因 git push 的錯誤而導致泄漏。

下一步是使用方便的 PyPI caldav 庫。我找到了我的電子郵件服務的 CalDAV 服務器(你可能有所不同):

  1. import caldav
  2. client = caldav.DAVClient(url="https://caldav.fastmail.com/dav/", username=username, password=password)

CalDAV 有一個稱為 principal(主鍵)的概念。它是什么并不重要,只要知道它是你用來訪問日歷的東西就行了:

  1. principal = client.principal()
  2. calendars = principal.calendars()

從字面上講,日歷就是關于時間的。訪問事件之前,你需要確定一個時間范圍。默認一星期就好:

  1. from dateutil import tz
  2. import datetime
  3. now = datetime.datetime.now(tz.tzutc())
  4. since = now - datetime.timedelta(days=7)

大多數人使用的日歷不止一個,并且希望所有事件都在一起出現。itertools.chain.from_iterable 方法使這一過程變得簡單:

  1. import itertools
  2.  
  3. raw_events = list(
  4.     itertools.chain.from_iterable(
  5.         calendar.date_search(start=since, end=now, expand=True)
  6.         for calendar in calendars
  7.     )
  8. )

將所有事件讀入內存很重要,以 API 原始的本地格式進行操作是重要的實踐。這意味著在調整解析、分析和顯示代碼時,無需返回到 API 服務刷新數據。

但 “原始” 真的是原始,事件是以特定格式的字符串出現的:

  1. print(raw_events[12].data)
  1.     BEGIN:VCALENDAR
  2.     VERSION:2.0
  3.     PRODID:-//CyrusIMAP.org/Cyrus
  4.      3.3.0-232-g4bdb081-fm-20200825.002-g4bdb081a//EN
  5.     BEGIN:VEVENT
  6.     DTEND:20200825T230000Z
  7.     DTSTAMP:20200825T181915Z
  8.     DTSTART:20200825T220000Z
  9.     SUMMARY:Busy
  10.     UID:
  11.      1302728i-040000008200E00074C5B7101A82E00800000000D939773EA578D601000000000
  12.      000000010000000CD71CC3393651B419E9458134FE840F5
  13.     END:VEVENT
  14.     END:VCALENDAR

幸運的是,PyPI 可以再次使用另一個輔助庫 vobject 解圍:

  1. import io
  2. import vobject
  3.  
  4. def parse_event(raw_event):
  5. data = raw_event.data
  6. parsed = vobject.readOne(io.StringIO(data))
  7. contents = parsed.vevent.contents
  8. return contents
  1. parse_event(raw_events[12])
  1. {'dtend': [<DTEND{}2020-08-25 23:00:00+00:00>],
  2. 'dtstamp': [<DTSTAMP{}2020-08-25 18:19:15+00:00>],
  3. 'dtstart': [<DTSTART{}2020-08-25 22:00:00+00:00>],
  4. 'summary': [<SUMMARY{}Busy>],
  5. 'uid': [<UID{}1302728i-040000008200E00074C5B7101A82E00800000000D939773EA578D601000000000000000010000000CD71CC3393651B419E9458134FE840F5>]}

好吧,至少好一點了。

仍有一些工作要做,將其轉換為合理的 Python 對象。第一步是 擁有 一個合理的 Python 對象。attrs 庫提供了一個不錯的開始:

  1. import attr
  2. from __future__ import annotations
  3. @attr.s(auto_attribs=True, frozen=True)
  4. class Event:
  5.     start: datetime.datetime
  6.     end: datetime.datetime
  7.     timezone: Any
  8.     summary: str

是時候編寫轉換代碼了!

第一個抽象從解析后的字典中獲取值,不需要所有的裝飾:

  1. def get_piece(contents, name):
  2. return contents[name][0].value
  3. get_piece(_, "dtstart")
  4. datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc())

日歷事件總有一個“開始”、有一個“結束”、有一個 “持續時間”。一些謹慎的解析邏輯可以將兩者協調為同一個 Python 對象:

  1. def from_calendar_event_and_timezone(event, timezone):
  2.     contents = parse_event(event)
  3.     start = get_piece(contents, "dtstart")
  4.     summary = get_piece(contents, "summary")
  5.     try:
  6.         end = get_piece(contents, "dtend")
  7.     except KeyError:
  8.         end = start + get_piece(contents, "duration")
  9.     return Event(start=start, end=end, summary=summary, timezone=timezone)

將事件放在 本地 時區而不是 UTC 中很有用,因此使用本地時區:

  1. my_timezone = tz.gettz()
  2. from_calendar_event_and_timezone(raw_events[12], my_timezone)
  3. Event(start=datetime.datetime(2020, 8, 25, 22, 0, tzinfo=tzutc()), end=datetime.datetime(2020, 8, 25, 23, 0, tzinfo=tzutc()), timezone=tzfile('/etc/localtime'), summary='Busy')

既然事件是真實的 Python 對象,那么它們實際上應該具有附加信息。幸運的是,可以將方法添加到類中。

但是要弄清楚哪個事件發生在哪一天不是很直接。你需要在 本地 時區中選擇一天:

  1. def day(self):
  2. offset = self.timezone.utcoffset(self.start)
  3. fixed = self.start + offset
  4. return fixed.date()
  5. Event.day = property(day)
  1. print(_.day)
  2. 2020-08-25

事件在內部始終是以“開始”/“結束”的方式表示的,但是持續時間是有用的屬性。持續時間也可以添加到現有類中:

  1. def duration(self):
  2. return self.end - self.start
  3. Event.duration = property(duration)
  1. print(_.duration)
  2. 1:00:00

現在到了將所有事件轉換為有用的 Python 對象了:

  1. all_events = [from_calendar_event_and_timezone(raw_event, my_timezone)
  2.               for raw_event in raw_events]

全天事件是一種特例,可能對分析生活沒有多大用處?,F在,你可以忽略它們:

  1. # ignore all-day events
  2. all_events = [event for event in all_events if not type(event.start) == datetime.date]

事件具有自然順序 —— 知道哪個事件最先發生可能有助于分析:

  1. all_events.sort(key=lambda ev: ev.start)

現在,事件已排序,可以將它們加載到每天:

  1. import collections
  2. events_by_day = collections.defaultdict(list)
  3. for event in all_events:
  4.     events_by_day[event.day].append(event)

有了這些,你就有了作為 Python 對象的帶有日期、持續時間和序列的日歷事件。

用 Python 報到你的生活

現在是時候編寫報告代碼了!帶有適當的標題、列表、重要內容以粗體顯示等等,有醒目的格式是很意義。

這就是一些 HTML 和 HTML 模板。我喜歡使用 Chameleon

  1. template_content = """
  2. <html><body>
  3. <div tal:repeat="item items">
  4. <h2 tal:content="item[0]">Day</h2>
  5. <ul>
  6. <li tal:repeat="event item[1]"><span tal:replace="event">Thing</span></li>
  7. </ul>
  8. </div>
  9. </body></html>"""

Chameleon 的一個很酷的功能是使用它的 html 方法渲染對象。我將以兩種方式使用它:

  • 摘要將以粗體顯示
  • 對于大多數活動,我都會刪除摘要(因為這是我的個人信息)
  1. def __html__(self):
  2. offset = my_timezone.utcoffset(self.start)
  3. fixed = self.start + offset
  4. start_str = str(fixed).split("+")[0]
  5. summary = self.summary
  6. if summary != "Busy":
  7. summary = "&lt;REDACTED&gt;"
  8. return f"<b>{summary[:30]}</b> -- {start_str} ({self.duration})"
  9. Event.__html__ = __html__

為了簡潔起見,將該報告切成每天的:

  1. import chameleon
  2. from IPython.display import HTML
  3. template = chameleon.PageTemplate(template_content)
  4. html = template(items=itertools.islice(events_by_day.items(), 3, 4))
  5. HTML(html)

渲染后,它將看起來像這樣:

2020-08-25

  • <REDACTED> -- 2020-08-25 08:30:00 (0:45:00)
  • <REDACTED> -- 2020-08-25 10:00:00 (1:00:00)
  • <REDACTED> -- 2020-08-25 11:30:00 (0:30:00)
  • <REDACTED> -- 2020-08-25 13:00:00 (0:25:00)
  • Busy -- 2020-08-25 15:00:00 (1:00:00)
  • <REDACTED> -- 2020-08-25 15:00:00 (1:00:00)
  • <REDACTED> -- 2020-08-25 19:00:00 (1:00:00)
  • <REDACTED> -- 2020-08-25 19:00:12 (1:00:00)

Python 和 Jupyter 的無窮選擇

通過解析、分析和報告各種 Web 服務所擁有的數據,這只是你可以做的事情的表面。

為什么不對你最喜歡的服務試試呢? 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2020-07-07 11:01:04

Linux工具命令

2023-02-23 09:02:40

CIO領域管理

2013-10-11 14:18:54

2013-10-11 13:31:10

2022-06-06 16:40:20

工作流程效率管理

2012-07-31 09:55:50

時間管理管理

2013-03-14 17:17:34

2020-02-24 11:11:10

IT企業技術

2022-01-13 13:24:16

工具底層邏輯

2023-07-03 22:31:40

2012-07-27 10:17:05

開發

2012-04-12 14:49:31

程序員

2020-05-06 11:10:28

Python代碼開發

2022-07-08 14:50:12

時間管理技巧工作效率

2020-11-23 15:49:28

物聯網

2012-09-26 09:52:57

項目項目回顧時間管理

2023-02-02 14:09:29

時間管理軟件

2023-01-17 16:05:50

程序員時間管理日程表

2018-12-12 09:44:07

Linux命令行時間管理

2019-02-27 11:10:29

時間管理軟件應用
點贊
收藏

51CTO技術棧公眾號

www.超碰97| 色乱码一区二区三区熟女| 日本少妇裸体做爰| 日韩极品在线| 欧美日韩精品系列| 日韩在线观看a| 韩国精品视频| 亚洲一级黄色大片| 国产第一亚洲| 亚洲在线视频一区| 日本黑人久久| 黑人精品一区二区三区| 视频一区二区三区中文字幕| 欧美成在线视频| 51妺嘿嘿午夜福利| 另类ts人妖一区二区三区| 欧美日韩国产在线播放网站| 福利视频一二区| 美女黄视频在线观看| 9色porny自拍视频一区二区| 国产精品久久久久久久久久99 | 波多野结衣综合网| 午夜老司机在线观看| 成人av在线资源| 国产精品极品美女粉嫩高清在线| 黄页网站免费观看| 久久中文视频| 亚洲欧美日韩国产中文| 中文字幕55页| 色综合一区二区日本韩国亚洲| 精品国产91久久久久久老师| 国产精品无码乱伦| www在线播放| 久久一区二区视频| 精品国产aⅴ麻豆| 性欧美videos另类hd| 免费欧美日韩国产三级电影| 欧美中文在线字幕| 日本一级一片免费视频| 欧美国产91| 日韩有码视频在线| 日韩av片在线免费观看| 欧美精品第一区| 日韩精品高清视频| 一级黄色电影片| 亚洲精品不卡在线观看| 欧美一区二区二区| а 天堂 在线| 国产精品白丝久久av网站| 欧美视频在线观看一区二区| 情侣黄网站免费看| 草草在线视频| 亚洲国产精品一区二区尤物区| 丰满人妻一区二区三区53号| 日本www在线| 亚洲日本乱码在线观看| 国产精品99久久久久久大便| 蜜桃视频在线观看www社区| 最新国产精品久久精品| 天天做天天爱天天高潮| 18av在线播放| 亚洲午夜私人影院| 国产精品视频一二三四区| 欧美24videosex性欧美| 午夜精品久久久久久久| 日韩av一二三四区| 456亚洲精品成人影院| 在线观看成人免费视频| 日本不卡一区二区在线观看| av成人在线网站| 欧美成人a视频| 先锋资源av在线| 免费精品国产| 中文字幕少妇一区二区三区| 国产福利视频网站| 国自产拍偷拍福利精品免费一| 久久久久久噜噜噜久久久精品| 日韩精品国产一区二区| 欧美一级一区| 国产一区视频在线播放| 国产成人精品无码高潮| 波多野洁衣一区| 日韩av电影免费在线| 免费在线观看av网站| 亚洲综合无码一区二区| www.com毛片| 日本午夜免费一区二区| 亚洲第一在线视频| 非洲一级黄色片| 午夜久久影院| 日本国产欧美一区二区三区| 糖心vlog精品一区二区| 国产91精品免费| 欧美一区二区视频17c| 日本在线免费| 天天综合天天做天天综合| 天美星空大象mv在线观看视频| 久久久久毛片| 亚洲成人av中文字幕| 蜜桃久久精品成人无码av| 中文字幕一区二区三区乱码图片 | 波多野结衣中文一区| 日韩激情久久| 动漫一区二区| 999精品视频在线观看| 国产精品欧美一级免费| av免费看网址| 日韩av黄色| 亚洲精品久久久久| 无码人妻精品一区二区三区夜夜嗨| 国产精品久久久免费| 91精品在线观| 极品美乳网红视频免费在线观看 | 亚洲天堂视频在线观看| 黄色一级视频在线观看| 男人的天堂亚洲一区| 国产精品久久久久久久久久直播 | 欧美综合在线视频| 欧产日产国产精品98| 99精品在线观看| 欧美在线激情网| 亚洲国产综合一区| 18成人在线视频| 精品免费国产一区二区| 精品亚洲精品| 欧美精品中文字幕一区| 亚洲在线观看av| 久久精品视频一区二区三区| 日韩精品一区二区免费| 四虎国产精品永久在线国在线| 亚洲精品视频播放| 国产第100页| 国产成人av在线影院| aaa免费在线观看| 成人国产网站| 亚洲系列中文字幕| 天天爽夜夜爽人人爽| 不卡一区中文字幕| 久久男人资源站| 亚洲五码在线| 九九精品视频在线| 99国产成人精品| 日韩理论片网站| 粉色视频免费看| 久久中文视频| 91精品综合视频| 欧美激情二区| 3751色影院一区二区三区| 五月婷婷六月香| 免费成人av资源网| 欧美一区观看| 成人精品三级| 精品国产欧美一区二区五十路 | 欧洲第一无人区观看| 精品一区精品二区高清| 波多野结衣三级在线| 亚洲三级在线| 欧美肥臀大乳一区二区免费视频| 亚洲成人久久精品| 亚洲午夜久久久久| 一女三黑人理论片在线| 久久精品中文| 日韩中文一区| 伊人久久大香线蕉综合影院首页| 北条麻妃99精品青青久久| 国产免费黄色录像| 亚洲高清视频的网址| 黑丝av在线播放| 视频一区二区国产| 中文字幕乱码一区二区三区| www一区二区三区| 欧美黑人巨大精品一区二区| 午夜成人鲁丝片午夜精品| 色婷婷国产精品久久包臀| 日韩女同一区二区三区| 狠狠色狠狠色综合系列| 丁香六月激情网| 九九精品久久| 91老司机在线| 91九色美女在线视频| 亚洲女人被黑人巨大进入al| 在线免费a视频| 亚洲一区二区三区视频在线播放| 久久久久久久久免费看无码| 青娱乐精品视频| 日韩精品免费一区| 国产一区不卡| 亚洲一区二区三区乱码aⅴ| av伦理在线| 中文字幕亚洲一区| 天天干天天摸天天操| 欧美中文字幕一区| 久草网在线观看| 国产日韩欧美精品综合| 在线观看一区二区三区视频| 久久精品官网| 国产在线观看欧美| 成人在线免费观看视频| 国产欧美日韩一区二区三区| 激情亚洲小说| 欧美一区二区三区免费视| 米奇精品一区二区三区| 日韩精品视频在线| 精品国产亚洲AV| 在线观看国产日韩| 国产成人精品a视频一区| 国产精品久久久久久亚洲毛片| 亚洲欧美日韩色| 国产精品自在在线| 中文字幕在线导航| 一本综合久久| 日韩欧美一级在线| 免费视频网站www| 国产成人99久久亚洲综合精品| 无码人妻丰满熟妇区毛片18 | 欧美狂野激情性xxxx在线观| 日韩大片在线观看| 久久亚洲国产精品日日av夜夜| 国产精品日本一区二区不卡视频 | 久久伊人精品天天| 极品美乳网红视频免费在线观看 | 国产在线日韩在线| 嫩草伊人久久精品少妇av杨幂| 久久青草福利网站| 亚洲制服国产| 久久精品久久久久| 91短视频版在线观看www免费| 日韩黄在线观看| 亚洲福利在线观看视频| 91精品国产91久久久久久一区二区| 黄色在线视频网址| 精品毛片网大全| 久久这里只有精品免费| 亚洲三级电影网站| 天天爽天天爽天天爽| 欧美国产视频在线| 一区二区三区四区免费| 91麻豆免费看片| 国产美女视频免费观看下载软件| 国产精品性做久久久久久| 日本成人xxx| 激情欧美一区二区三区在线观看| 一区二区三区免费播放| 日韩精品一二三区| 亚洲综合在线网站| 三级欧美在线一区| 国产a级片免费观看| 老司机久久99久久精品播放免费| 黄色片视频在线免费观看| 亚洲一区二区三区四区五区午夜 | 国产精品13p| 国内精品视频一区| 国产精选在线| 欧美一区二区大胆人体摄影专业网站| 黄色在线网站噜噜噜| 欧美性视频在线| 欧美办公室脚交xxxx| 欧美亚洲日本网站| 日韩不卡免费高清视频| 国产精品麻豆va在线播放| 激情久久99| 91亚洲精品久久久| 超碰成人在线免费| 久久精品一区二区三区不卡免费视频| 美女呻吟一区| 色综合久久av| 女人天堂亚洲aⅴ在线观看| 国产一二三四区在线观看| 最新国产拍偷乱拍精品| 欧美老熟妇喷水| 蜜臀av国产精品久久久久| 奇米影视四色在线| 国产精品白丝av| 北岛玲一区二区| 国产日产精品一区| 亚洲综合网在线| 亚洲va欧美va人人爽午夜| 波多野结衣日韩| 欧美丰满嫩嫩电影| 狠狠人妻久久久久久综合麻豆| 国产丝袜精品第一页| wwwxxx在线观看| 欧美黄色成人网| 天堂久久午夜av| 亚洲中国色老太| 蜜臀91精品国产高清在线观看| 亚洲视频精品一区| 亚洲无吗在线| 亚洲成色www.777999| 国产91在线|亚洲| 欧美福利第一页| 亚洲一区二区精品视频| 亚洲精品91天天久久人人| 日韩一区二区影院| 国产一级二级三级在线观看| 美女精品久久久| 天天综合网站| 高清日韩一区| 99九九热只有国产精品| 国产一区二区视频播放| 久久er99热精品一区二区| 永久免费未满蜜桃| 亚洲四区在线观看| 国产成人精品777777| 欧美tickling网站挠脚心| av天在线观看| 2019国产精品自在线拍国产不卡| 91亚洲精品在看在线观看高清| 欧美lavv| 亚洲欧洲视频| 婷婷激情小说网| 国产日韩欧美制服另类| 久久久久久久久久影院| 欧美一卡2卡3卡4卡| 国产精品久久久久久久龚玥菲| 欧美激情视频网| 国产区一区二| 亚洲精品日韩在线观看| 国产农村妇女精品一二区| 日本少妇一级片| 亚洲视频一区二区免费在线观看| 色老头一区二区| 亚洲欧美日韩直播| 成人观看网址| 国产伦一区二区三区色一情| 91tv官网精品成人亚洲| 欧美成人福利在线观看| 久久久久久97三级| 黑人精品无码一区二区三区AV| 精品88久久久久88久久久| 在线网址91| 92国产精品视频| 亚洲国产一区二区三区在线播放 | 成人免费看片'免费看| 精品亚洲成a人在线观看| 亚洲午夜精品久久久久久高潮| 欧美日韩亚洲成人| 视频一区二区免费| 久久久久久国产精品美女| 视频一区日韩| 福利视频免费在线观看| 成人深夜福利app| 久久久全国免费视频| 日韩欧美一区二区视频| caopeng在线| av免费观看久久| 亚洲激情一区| 国产三级国产精品| 色综合久久久久久久久久久| 青草久久伊人| 国产精品第一视频| 青青草综合网| 中文字幕剧情在线观看| 一区二区三区av电影| 免费观看a视频| 2019av中文字幕| 国产一区日韩| 91欧美视频在线| 一区二区三区在线影院| 成人免费公开视频| 57pao成人永久免费视频| 精品美女久久| www.污网站| 亚洲成a人v欧美综合天堂下载| 色香蕉在线视频| 奇米成人av国产一区二区三区| 国产真实有声精品录音| av网站在线不卡| 成人免费一区二区三区在线观看 | 国产精品一区二区久久不卡| 久久国产精品二区| 日韩久久午夜影院| 成人a在线观看高清电影| 米仓穗香在线观看| 91在线高清观看| 又色又爽又黄无遮挡的免费视频| 久久精品国产一区二区电影| 国产精品45p| 亚洲国产精品毛片av不卡在线| 国产精品久久久久久久浪潮网站| 99视频国产精品免费观看a| 国模私拍视频一区| 精品一区电影| 老司机av网站| 色婷婷狠狠综合| 最新黄网在线观看| 欧美日韩国产精品一区二区| 国产一区免费电影| 亚洲黄色小说图片| 在线看日韩av| 国产精品超碰| 五月天激情视频在线观看| 亚洲影视在线播放| 在线观看免费黄色| 国产美女精品在线观看| 美女www一区二区| 日韩成人在线免费视频| 精品国产欧美一区二区三区成人| 日韩超碰人人爽人人做人人添| 色噜噜狠狠一区二区|