2015-12-21 79 views
1

我想知道是否可以根據列的類型有條件地使用轉換器。例如,如果數據集由兩列構成,其中第一列可以是整數或時間戳,如果文件最終有一個時間戳列,則可以有條件地使用轉換器,並避免在列中包含整數時調用轉換器值。我可以有條件地使用熊貓read_csv轉換器嗎?

這可以在read_csv之外完成,當數據已經加載但它可能會效率較低。

回答

2

read_csv docs指出您可以使用date_parser參數傳遞自定義日期解析函數。

所以,你可以這樣做:

from datetime import datetime 
import pandas as pd 
from dateutil.parser import parse 


def parse_date_or_ts(data): 
    try: 
     return parse(data) 
    except ValueError: 
     # let's assume data is a utc timestamp now 
     return datetime.utcfromtimestamp(int(data)) 

df = pd.read_csv('data.csv', 
       parse_dates={'date': [0]}, # index 0 is our date/ts mixed column 
       date_parser=parse_date_or_ts) 
+0

我結束了推動轉換器內部的情況,所以我的解決方案是非常相似,這只是我沒有明確使用日期解析器。順便說一句,我避免使用try catch語句,雖然它更直觀,因爲對於引發異常的情況,可能是由於異常處理的異步性質,它會嚴重影響性能。所以相反,我使用了一個假設/ hackish條件,比如'if len(data.split(':'))> 1:'。我討厭但它更快。 – LetsPlayYahtzee

+0

你說得對,就執行時間而言,嘗試除了不是最快的方法。我只是用它作爲例子。但是,如果您的時間戳記只能在數字中生成,您還可以使用[str.isdigit()](https://docs.python.org/2/library/stdtypes.html#str.isdigit),它更具可讀性,應該非常快。 – Haes

+0

所以我認爲沒有辦法避免調用轉換器/ date_parser,因此我的問題的答案應該是不是,對吧? – LetsPlayYahtzee