pandas 中處理日期相減問題

pandas 中處理日期相減問題.

假設 有這樣 一個需求, 我獲取了一組日期是某個人的通話日期,
我想計算出 這段時間裏面, 沒有通話的天數, 以及 連續3天以上沒有通話的次數

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time    : 2019/5/1 08:02
@File    : test_diff.py
@Author  : [email protected]


pandas 裏面 如何 對日期進行相減 .


假設 有這樣 一個需求, 我獲取了一組日期是某個人的通話日期,
我想計算出 這段時間裏面, 沒有通話的天數,  以及 連續3天以上沒有通話的次數

如何計算呢?

舉個例子:

假設 我要計算 從5.2號 到 5.11 這段時間裏,沒有通話的天數

['2018-05-02', '2018-05-05', '2018-05-11']



可以看出 這些天 沒有通話的天數,  無通話天數 就是 6 天
nocall_date = [5.3, 5.4 ,5.6 ,5.7,  5.8, 5.9,5.10 ]


連續3(包括3天)天以上沒有通話的次數:


5.6 ,5.7,  5.8, 5.9,5.10   這是 1 次

5.3, 5.4    這是  0 次

總的 就是 1 次



solution:   首先 把這些 日期轉成pandas.Series   之後 排序,去重之後, 然後diff
無通話記錄的就是 差值 大於1 天的記錄.

連續3(包括3天)天以上沒有通話的記錄 就是 差值 大於4天 的記錄.



"""

from datetime import timedelta

import pandas as pd

from datetime import datetime

if __name__ == '__main__':
    call_dates = [
        '2018-05-02', '2018-05-03', '2018-07-21', '2018-07-15', '2018-05-07',
        '2018-05-07', '2018-07-20', '2018-07-17', '2018-07-19', '2018-07-19',
        '2018-07-13', '2018-06-14', '2018-05-19'
    ]

    # 轉成 datetime 類型
    mydate = [datetime.strptime(item, '%Y-%m-%d') for item in call_dates]

    # 轉成 series 
    s = pd.Series(mydate)

    # 去除重複數據
    s.drop_duplicates(inplace=True)

    # 排序
    s.sort_values(inplace=True)

    # 重新調整一下index 下標
    s.reset_index(drop=True, inplace=True)

    # 求差值
    diff_value = s.diff()

    one_day = timedelta(days=1)
    three_day = timedelta(days=3)

    # 計算無通話記錄的次數
    diff_days = diff_value.loc[lambda x: x > one_day]

    # 重置 index
    diff_days.reset_index(drop=True, inplace=True)
    print(f"無通話記錄的次數:{diff_days.size}")

    nocall_days = sum([delta.days for delta in diff_days]) - diff_days.size
    print(f"無通話記錄的天數:{nocall_days}")

    # 計算 連續3(包括3天)天以上沒有通話的記錄
    three_days_nocall = diff_value.loc[lambda x: x > three_day]
    print(f"連續3(包括3天)天以上沒有通話的記錄的次數:{three_days_nocall.size}")


去重 排序後的series

imgage
去重 排序後的series

diff_value
image
diff_value

過濾後掉 1day 的 差值的 series diff_days
image
過濾後掉 1day 的 差值的 series   diff_days

結果如下:

無通話記錄的次數:7
無通話記錄的天數:70
連續3(包括3天)天以上沒有通話的記錄的次數:4
總結

本文主要講了如何將 時間字符串轉成pandas 中 可以相減的方式. 方法是先轉成 datetime 之後 轉成 series ,在series 裏面 可以方便的實現 日期相減,去重,排序等操作.

分享快樂,留住感動. 2019-05-01 09:35:08 --frank
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章