1 Востаннє редагувалося ping (18.10.2019 17:38:55)

Тема: Обрежно, баги(чи описані баги - це - фічі ?) ) (pandas і час )

python 3.5, pandas '0.22.0'

поотрібно перетворити в datetime object текстове представлення дати

>>pd.to_datetime(pd.Series(['2018-02-22']), format='%Y-%m-%d')
0   2018-02-22
dtype: datetime64[ns]

все чудово, але

>> pd.to_datetime(pd.Series(['3018-02-22']), format='%Y-%m-%d')
TypeErrorTraceback (most recent call last)
/usr/local/lib/python3.5/dist-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
... skipped ...
ValueError: time data '3018-02-22' doesn't match format specified

ще цікавіше і можна цілком нарватися на проблему, бо навіть не кине ексепшн:

>>pd.Series(['2018-02-22']).astype('datetime64[ns]')
0   2018-02-22
dtype: datetime64[ns]

але, увага:

>>pd.Series(['3018-02-22']).astype('datetime64[ns]')
0   1849-01-13 00:50:52.580896768
dtype: datetime64[ns]

Звісно, якщо покопатися в документації, то знайдеться

:
Timestamp limitations
Since pandas represents timestamps in nanosecond resolution, the time span that can be represented using a 64-bit integer is limited to approximately 584 years:

In [92]: pd.Timestamp.min
Out[92]: Timestamp('1677-09-21 00:12:43.145225')

In [93]: pd.Timestamp.max
Out[93]: Timestamp('2262-04-11 23:47:16.854775807')

Але, можна перетворити 3018 в 1849 і навіть не помітити (

First, solve the problem. Then, write the code. (c)JJ

2

Re: Обрежно, баги(чи описані баги - це - фічі ?) ) (pandas і час )

Із часом завжди купа геморою. Треба детально читати, що для чого призначено. Але нащо вам timestamp-и 3018-го року? Ви плануєте, що ваш код доживе до того часу?

3

Re: Обрежно, баги(чи описані баги - це - фічі ?) ) (pandas і час )

koala написав:

Із часом завжди купа геморою. Треба детально читати, що для чого призначено. Але нащо вам timestamp-и 3018-го року? Ви плануєте, що ваш код доживе до того часу?

timestamp - це особливість пандасу який векторно ( через numpy) лопатить міліони записів паралельно
якщо робити це через for - час обробки зросте на порядки

іде обробка величезного датасету. і там є різні , внесені людиною чи при агрегації з різних баз даних, помилки.
звісно, проводиться фільтрація (скажімо mean +/- 3 * std )
але, щоб їх порахувати - треба спершу перевести з тексту в дататайм

доведеться додати попередню фільтрацію через regex

    date_pattern = re.compile(r'^([12]\d{3}-\d{2}-\d{2})')

    matched = data['list_date'].str.extract(date_pattern, expand=False)
    matched = matched[matched.notna()]                  
    
First, solve the problem. Then, write the code. (c)JJ

4

Re: Обрежно, баги(чи описані баги - це - фічі ?) ) (pandas і час )

timestamp - це, зазвичай, фіксація поточного моменту, і він навряд чи буде з XIX чи XXIII століття (чи багато речей, які ви використовуєте, виготовлені в XIX столітті?).