2017-04-12 28 views
3

我有一個數據集,其中,所述小時被記錄爲[0100:2400],而不是[0000:2300]熊貓:解析24:00而不是00:00

例如

pd.to_datetime('201704102300', format='%Y%m%d%H%M') 

返回

Timestamp('2017-04-10 20:00:00') 

但是

pd.to_datetime('201704102400', format='%Y%m%d%H%M') 

給我的錯誤:

ValueError: unconverted data remains: 0

我怎樣才能解決這個問題?

我可以手動調整數據,例如SO Post中提到的,但我認爲大熊貓應該已經處理過這種情況了?

更新:

以及如何以可擴展的方式爲數據框做到這一點?例如,數據如下所示 enter image description here

+0

這是*不*非標準時間格式,但它主要是通過編程語言和框架忽略。這是24小時或軍事時間,廣泛用於*航空公司*。如果您購買機場插槽,或計算過夜費用,一天中的最後一刻與下一個 –

回答

4

Pandas使用系統strptime,所以如果您需要非標準的東西,您可以滾動自己的東西。

代碼:

import pandas as pd 
import datetime as dt 

def my_to_datetime(date_str): 
    if date_str[8:10] != '24': 
     return pd.to_datetime(date_str, format='%Y%m%d%H%M') 

    date_str = date_str[0:8] + '00' + date_str[10:] 
    return pd.to_datetime(date_str, format='%Y%m%d%H%M') + \ 
      dt.timedelta(days=1) 

print(my_to_datetime('201704102400')) 

結果:

2017-04-11 00:00:00 

對於在pandas.DataFrame一個柱:

df['time'] = df.time.apply(my_to_datetime) 
+0

的第一刻不同*另外,我想知道如何使用數據幀列來執行此操作?例如查看更新。 – cqcn1991

+0

沒問題..... –

4

矢量化的解決方案,其使用方法pd.to_datetime(DataFrame)

來源DF

In [27]: df 
Out[27]: 
      time 
0 201704102400 
1 201602282400 
2 201704102359 

In [28]: pat = '(?P<year>\d{4})(?P<month>\d{2})(?P<day>\d{2})(?P<hour>\d{2})(?P<minute>\d{2})' 

In [29]: pd.to_datetime(df['time'].str.extract(pat, expand=True)) 
Out[29]: 
0 2017-04-11 00:00:00 
1 2016-02-29 00:00:00 
2 2017-04-10 23:59:00 
dtype: datetime64[ns] 

說明:

In [30]: df['time'].str.extract(pat, expand=True) 
Out[30]: 
    year month day hour minute 
0 2017 04 10 24  00 
1 2016 02 28 24  00 
2 2017 04 10 23  59 

pat是在Series.str.extract()功能正則表達式模式參數

UPDATE:定時

In [37]: df = pd.concat([df] * 10**4, ignore_index=True) 

In [38]: df.shape 
Out[38]: (30000, 1) 

In [39]: %timeit df.time.apply(my_to_datetime) 
1 loop, best of 3: 4.1 s per loop 

In [40]: %timeit pd.to_datetime(df['time'].str.extract(pat, expand=True)) 
1 loop, best of 3: 475 ms per loop 
+0

「pat」是什麼?有沒有關於它的文檔? – cqcn1991

+0

@ cqcn1991,我已在回答中添加了簡短描述 – MaxU

+0

謝謝,速度更快! – cqcn1991