數據清洗之微博時間清洗


數據清洗之微博時間清洗

爬取微博的時候時間格式比較亂,存到數據庫要統一成datatime類型,所以需要用到對時間的轉換
這里是對time模塊和datetime的模塊的使用。

對於當天的有三種:

40秒前
50分鍾前
今天 08:12

針對這三種,第一步要做的是獲取當前的年月日

import datetime
now = datetime.datetime.now()
ymd = now.strftime("%Y-%m-%d")
#或者
#datetime.day,datetime.month,datetime.year 分別表示一個datetime對象的日,月,年

解釋

第一行我們導入datetime模塊 第二行獲取當前的時間,datetime類型: ``` 2018-07-20 09:28:19.080791 ``` 包含年月日和時分秒 第三行,strftime函數是格式化字符里面的參數是一個輸出的字符串格式: 比如這里 的%Y代表四個數字表示的年份(%y是二位的),%m是表示月份,%d返回的是當前時間是當前月的第幾天,其他的格式看下面的圖有詳細的解釋。 ![](https://images2018.cnblogs.com/blog/736399/201807/736399-20180720110353893-108208662.jpg)

接上我們分析第一個,
40秒前

第一步:獲取當前的時間
上面已經獲取now了。
第二步:減去40s
時間上的加減我們使用datetime的timedalte屬性,
timedalte 是datetime中的一個對象,該對象表示兩個時間的差值。
timedalte 的構造函數如下:

 def __init__(self, days: float = ..., seconds: float = ..., microseconds: float = ...,
                 milliseconds: float = ..., minutes: float = ..., hours: float = ...,
                 weeks: float = ...) -> None: ...

於是就有了下面的結果

newdate = now - datetime.timedelta(minutes=int(seconds[:-2]))

同理

50分鍾前

newdate = now - datetime.timedelta(minutes=int(newstr[:-3]))

然后說最后另一種:
今天 08:12
第一步:補齊年月日
第二步:使用time模塊的strptime() 函數根據指定的格式把一個時間字符串解析為時間元組,

語法

strptime()方法語法:

time.strptime(string[, format])

參數

string -- 時間字符串。
format -- 格式化字符串。

返回值

返回struct_time對象。

日期格式化符號:

%y 兩位數的年份表示(00-99)
%Y 四位數的年份表示(000-9999)
%m 月份(01-12)
%d 月內中的一天(0-31)
%H 24小時制小時數(0-23)
%I 12小時制小時數(01-12)
%M 分鍾數(00=59)
%S 秒(00-59)
%a 本地簡化星期名稱
%A 本地完整星期名稱
%b 本地簡化的月份名稱
%B 本地完整的月份名稱
%c 本地相應的日期表示和時間表示
%j 年內的一天(001-366)
%p 本地A.M.或P.M.的等價符
%U 一年中的星期數(00-53)星期天為星期的開始
%w 星期(0-6),星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地相應的日期表示
%X 本地相應的時間表示
%Z 當前時區的名稱
%% %號本身

第三步:time.mktime轉換成時間戳
第四步:使用datetime的fromtimestamp模塊,把時間戳轉換為

mdate = time.mktime(time.strptime(ymd + newstr, '%Y-%m-%d今天 %H:%M'))
newdate = datetime.datetime.fromtimestamp(mdate)

其他的處理思路就一樣了,下面代碼給出目前遇到的格式:

    def get_format_datetime(self,datestr):

        now = datetime.datetime.now()
        ymd = now.strftime("%Y-%m-%d")
        y = now.strftime("%Y")
        newstr = datestr
        newdate = now
        if u"樓" in datestr:
            newstr = datestr.split(u"樓")[-1].strip()
        if (u"今天" in newstr):

            mdate = time.mktime(time.strptime(ymd + newstr, '%Y-%m-%d今天 %H:%M'))
            newdate = datetime.datetime.fromtimestamp(mdate)
        elif (u"月" in newstr):
            mdate = time.mktime(time.strptime(y + newstr, '%Y%m月%d日 %H:%M'))
            newdate = datetime.datetime.fromtimestamp(mdate)
        elif (u"分鍾前" in newstr):
            newdate = now - datetime.timedelta(minutes=int(newstr[:-3]))
        elif (u"秒前" in newstr):
            newdate = now - datetime.timedelta(minutes=int(newstr[:-2]))
        #以下為手機端
        elif "-" in newstr:
            mdate = time.mktime(time.strptime(y+"-"+ newstr, '%Y-%m-%d'))
            newdate = datetime.datetime.fromtimestamp(mdate)
        elif (u"昨天" in newstr):
            mdate = time.mktime(time.strptime(ymd + newstr, '%Y-%m-%d昨天 %H:%M'))
            newdate = datetime.datetime.fromtimestamp(mdate)-datetime.timedelta(days=1)
        elif (u"小時前" in newstr):
            newdate = now - datetime.timedelta(hours=int(newstr[:-3]))
        else:
            newdate = datetime.datetime.strptime(newstr, "%Y-%m-%d %H:%M")
        return newdate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM