Как перевести значения UNIXTIMESTAMP в дату?

Есть DataFrame который содержит дату в UNIXTIMESTAMP.

Как перевести значение, если они превышают допустимое значение стандартных функций Pandas?

df = pd.DataFrame({'DATETIME': [96028070400000,10967555200000,1567555200000,-1167555200000]})

Пробовал to_datetime, падает с ошибкой:

df['DATETIME'] = pd.to_datetime(df['DATETIME'], unit='ms')

Пробовал to_timedelta, неправильно переводит первый элемент:

df['DATETIME'] = pd.to_timedelta(df['DATETIME'], unit='ms') + pd.Timestamp('1970-01-01')

Должно получится примерно так:

df = pd.DataFrame({'DATETIME': [5013-01-04,2317-07-20,2019-09-04,1933-01-01]})

Ответы (2 шт):

Автор решения: MaxU

Возможно у вас UNIXTIMESTAMP в микросекундах?

In [155]: pd.to_datetime(df['DATETIME'], unit='us')
Out[155]:
0   1973-01-16 10:27:50.400
1   1970-05-07 22:32:35.200
2   1970-01-19 03:25:55.200
3   1969-12-18 11:40:44.800
Name: DATETIME, dtype: datetime64[ns]

или в наносекундах:

In [160]: pd.to_datetime(df['DATETIME'], unit='ns')
Out[160]:
0   1970-01-02 02:40:28.070400
1   1970-01-01 03:02:47.555200
2   1970-01-01 00:26:07.555200
3   1969-12-31 23:40:32.444800
Name: DATETIME, dtype: datetime64[ns]
→ Ссылка
Автор решения: MaxU

Можно воспользоваться типом данных period[D]:

df["date"] = (df["DATETIME"]
              .div(1000)
              .apply(lambda x: pd.Period(DT.utcfromtimestamp(x)
                                           .strftime("%Y-%m-%d"))))

Результат:

In [189]: df
Out[189]:
         DATETIME        date
0  96028070400000  5013-01-04
1  10967555200000  2317-07-20
2   1567555200000  2019-09-04
3  -1167555200000  1933-01-01

Арифметика с датами работает с этим типом данных:

In [190]: df["date"] + pd.offsets.Day(1)
Out[190]:
0    5013-01-05
1    2317-07-21
2    2019-09-05
3    1933-01-02
Name: date, dtype: period[D]

In [191]: df.dtypes
Out[191]:
DATETIME        int64
date        period[D]
dtype: object
→ Ссылка