您好,登錄后才能下訂單哦!
前言
昨天在網賽中做了一道題,雖然是外國人的Englis題目,但是內容很有學習的價值,值得仔細的學習,今天就把我所收獲的一部分記錄下來。其一:做個學習的資料記錄。其二:分享出來,供大家參考。
(收獲了對處理大數據的又一次認識!!!)
這是一道將DataFrame的日期數據轉換為python能認識的題目。這里重點講一下to_datetime的部分使用。
首先說一下:
這是一部分的時間轉換格式,通過以上的格式,你可以將DataFrame中的時間格式轉換為以下等python格式:
0 2007-03-02 1 2007-03-22 2 2007-04-06 3 2007-04-14 4 2007-04-15 Name: date_parsed, dtype: datetime64[ns]
看見沒有dtype:datetime64,這是轉換過后的形式,其實你可以將原數據使用dtype查看列,來看它的格式。你會發現它是object形式的。這里說一下。這個object格式一般是python用來記錄可變化的兌現的格式。這個格式它并不能認出是時間格式,盡管我們一眼就能看出(人和機器的區別在此)。
data = pd.read_csv('path') #這里我們得到data數據 data['date'].heade() #查看一下日期列的樣子
0 01/02/1965 1 01/04/1965 2 01/05/1965 3 01/08/1965 4 01/09/1965 Name: Date, dtype: object
可以看出它為object格式,并非日期格式。
data['date_parsed'] = pd.to_datetime(data['date'],format="%m/%d/%y")
上面為 我們按python格式轉換時間,并添加到新的一列中去。
dara['date_parsed'].head() #查看一下結果
0 1965-01-02 1 1965-01-04 2 1965-01-05 3 1965-01-08 4 1965-01-09 Name: data_parsed, dtype: datetime64[ns]
可以看到不論形式還是類型都改變了,當然這只是一點皮毛,如果只是這里點,這個博客意義不大
其實在使用上面語句轉換時間是,并不是這么順利:
/opt/conda/lib/python3.6/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz) 271 try: 272 result = array_strptime(arg, format, exact=exact, --> 273 errors=errors) 274 except tslib.OutOfBoundsDatetime: 275 if errors == 'raise': pandas/_libs/tslibs/strptime.pyx in pandas._libs.tslibs.strptime.array_strptime() ValueError: time data '1975-02-23T02:58:41.000Z' does not match format '%m/%d/%Y' (match)
一部分錯誤信息如上。
面對加載都要加載半天的數據出了錯誤,你真的是無助的,如果要去看數據怕是要看一天。
當然有人會說不是有錯誤信息嗎?當然我知道,但是一但當信息量大了以后,當時是茫然的。花了半天查找其他時間的轉換方式。無果。于是靜下心來發現問題。可以看出它說有一下格式不能轉換。
'1975-02-23T02:58:41.000Z'
所以我又換了一種格式將時分秒都匹配了,又提醒年月日不匹配。反復的驗證后發現應該是原數據有問題,部分時間并不是同意的格式。哈哈發現問題了,我們可以修改了。
我第一次的修改方式為:
data['over_long'] = data['Date'].apply(len) #添加一列記錄沒行時間的長度 data.loc[data['over_long'] > 10] #輸出大于正常數據的行 這里會發現缺失有那么幾行在作怪!!!
normal_dates = data.loc[data['over_long'] < 11] #篩選出正常數據 normal_dates = normal_dates.copy() #拷貝 normal_dates['data_parsed'] = pd.to_datetime(normal_dates['Date'],format='%m/%d/%Y') #再次轉換時間,發現沒有報錯了 哈哈 normal_dates['data_parsed'].head(10) #輸出查看沒問題的
以上是我的第一次解決方法。
后續在別人的指導下了解了其他的幾種更好的方法。(畢竟我刪除數據的方式不好)
第一種和第二種:
data['date_parsed'] = pd.to_datetime(data['Date'], format = "%m/%d/%Y", errors = 'coerce')
data['date_parsed'] = pd.to_datetime(data['Date'],infer_datetime_format=True)
兩個都能實現我試了一下。畢竟對to_datetime不太熟悉所以犯了錯。
OK!全部完成了。但是我想說的以上都不是最重要的。
最重要的是一種經驗的掌握。當你面對大量的數據時千萬不要緊張,它們也是小數據構成的,只要冷靜下來,你就能想到方法來解決。這才是我想說的!!!與君共勉。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。