日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Jupyter改善你的時間管理

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

在昔陽等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計、做網(wǎng)站 網(wǎng)站設(shè)計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,昔陽網(wǎng)站建設(shè)費用合理。

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

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

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

在 Jupyter 中使用 Python 解析日歷

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

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

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

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

 
 
 
 
  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()

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

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

大多數(shù)人使用的日歷不止一個,并且希望所有事件都在一起出現(xiàn)。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. )

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

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

 
 
 
 
  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': [],
  2. 'dtstamp': [],
  3. 'dtstart': [],
  4. 'summary': [],
  5. 'uid': []}

好吧,至少好一點了。

仍有一些工作要做,將其轉(zhuǎn)換為合理的 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

是時候編寫轉(zhuǎn)換代碼了!

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

 
 
 
 
  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())

日歷事件總有一個“開始”、有一個“結(jié)束”、有一個 “持續(xù)時間”。一些謹(jǐn)慎的解析邏輯可以將兩者協(xié)調(diào)為同一個 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)

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

 
 
 
 
  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 對象,那么它們實際上應(yīng)該具有附加信息。幸運的是,可以將方法添加到類中。

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

 
 
 
 
  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

事件在內(nèi)部始終是以“開始”/“結(jié)束”的方式表示的,但是持續(xù)時間是有用的屬性。持續(xù)時間也可以添加到現(xiàn)有類中:

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

現(xiàn)在到了將所有事件轉(zhuǎn)換為有用的 Python 對象了:

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

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

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

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

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

現(xiàn)在,事件已排序,可以將它們加載到每天:

 
 
 
 
  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 對象的帶有日期、持續(xù)時間和序列的日歷事件。

用 Python 報到你的生活

現(xiàn)在是時候編寫報告代碼了!帶有適當(dāng)?shù)臉?biāo)題、列表、重要內(nèi)容以粗體顯示等等,有醒目的格式是很意義。

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

 
 
 
 
  1. template_content = """
  2. Day

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

    • 摘要將以粗體顯示
    • 對于大多數(shù)活動,我都會刪除摘要(因為這是我的個人信息)
     
     
     
     
    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 = "<REDACTED>"
    8. return f"{summary[:30]} -- {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

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

    Python 和 Jupyter 的無窮選擇

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

    為什么不對你最喜歡的服務(wù)試試呢? 


    網(wǎng)站名稱:使用Jupyter改善你的時間管理
    轉(zhuǎn)載源于:http://www.dlmjj.cn/article/cccpjje.html