簡體   English   中英

熊貓:解析 24:00 而不是 00:00

[英]Pandas: parsing 24:00 instead of 00:00

我有一個數據集,其中小時記錄為[0100:2400] ,而不是[0000:2300]

例如

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:未轉換的數據仍然存在:0

我該如何解決這個問題?

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

更新:

以及如何以可擴展的方式為數據幀做到這一點? 例如,數據看起來像這樣在此處輸入圖片說明

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)

矢量化解決方案,它使用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

patSeries.str.extract()函數中的 RegEx 模式參數

更新:時間

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

基於@MaxU 的回答,通過對輸入字符串進行切片、將日期直接解析為 datetime 並將其余部分添加為 timedelta,可以獲得更高的效率。 前任:

df = pd.DataFrame({'time': ["201704102400", "201602282400","201704102359"]})

df['time'] = (pd.to_datetime(df['time'].str[:8], format='%Y%m%d') + 
              pd.to_timedelta(df['time'].str[8:10]+':'+df['time'].str[10:12]+':00'))

df['time']
0   2017-04-11 00:00:00
1   2016-02-29 00:00:00
2   2017-04-10 23:59:00
Name: time, dtype: datetime64[ns]

30k 個元素 df 的相對%timeit比較顯示出舒適的x2改進:

%timeit pd.to_datetime(df['time'].str[:8], format='%Y%m%d') + pd.to_timedelta(df['time'].str[8:10]+':'+df['time'].str[10:12]+':00')      
50 ms ± 270 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit pd.to_datetime(df['time'].str.extract(pat, expand=True))
122 ms ± 1.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df.time.apply(my_to_datetime)
3.34 s ± 3.26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM