2016-02-29 49 views
0

我的數據框的時間由2個coloumns:dateHrMn,像這樣:熊貓:如何閱讀錯誤的時間數據?

enter image description here

我怎麼能讀他們進入的時間,繪製時間序列圖? (還有其他值列,例如speed)。

我想我可以逃脫time.strptime('19900125'+'1200','%Y%m%d%H%M')

但問題是,從csv閱讀時,HrMn0000將被解析爲0,所以 time.strptime('19900125'+'0','%Y%m%d%H%M')將失敗。

UPDATE:

我目前的做法:

# When reading the data, pase HrMn as string 
df = pd.read_csv(uipath,header=0, skipinitialspace=True, dtype={'HrMn': str}) 
df['time']=df.apply(lambda x:datetime.strptime("{0} {1}".format(x['date'],x['HrMn']), "%Y%m%d %H%M"),axis=1)# df.temp_date 
df.index= df['time'] 
# Then parse it again as int 
df['HrMn'] = df['HrMn'].astype(int) 
+0

我認爲,如果你這樣做只會工作:'DF = pd.read_csv(uipath,頭= 0,skipinitialspace =真,parse_dates = [ '時間', 'HRMN'])' – EdChum

回答

2

您可以使用pd.to_datetime你已經把它改造成看起來像一個日期的字符串後:

def to_date_str(r): 
    d = r.date[: 4] + '-' + r.date[4: 6] + '-' + r.date[6: 8] 
    d += ' '+ r.HrMn[: 2] + ':' + r.HrMn[2: 4] 
    return d 

>>> pd.to_datetime(df[['date', 'HrMn']].apply(to_date_str, axis=1)) 
0 1990-01-25 12:00:00 
dtype: datetime64[ns] 

編輯

As @EdChu您可以更簡單地做到這一點,因爲

pd.to_datetime(df.date.astype(str) + df.HrMn) 

其中字符串 - 連接列。

+0

我'd連接列然後解析而不是調用'apply''pd.to_datetime(df ['date'] + df ['HrMn'])' – EdChum

+0

@EdChum超酷!我從來不會猜到'to_datetime'會對此產生影響。謝謝! –

+1

也可以調用'astype'而不是'map':'df ['date']。astype(str)'不確定是否更快,但這是'dtype'轉換的首選方法 – EdChum

2

您可以直接在閱讀的CSV,其中HrMn是補零爲HHMM,解析日期即0值將代表00:00

df = pd.read_csv(
    uipath, 
    header=0, 
    skipinitialspace=True, 
    dtype={'HrMn': str}, 
    parse_dates={'datetime': ['date', 'HrMn']}, 
    date_parser=lambda x, y: pd.datetime.strptime('{0}{1:04.0f}'.format(x, int(y)), 
                '%Y%m%d%H%M'), 
    index_col='datetime' 
) 
0

我不明白你爲什麼把它叫做「病格式化「,這種格式實際上是相當普遍的,熊貓可以按原樣解析它,只需指定要將哪些列解析爲時間戳即可。

df = pd.read_csv(uipath, skipinitialspace=True, 
       parse_dates=[['date', 'HrMn']]) 
+0

It報告「['date''HrMn']不在索引中」,我不知道爲什麼? – cqcn1991

+0

好的細節取決於你確切的csv文件,我沒有。根據您發佈的代碼,在我認爲這應該起作用之前,請參閱我的編輯。但我沒有什麼可以測試的,所以不能確定。 – Goyo