如何在pandas datetime64列和1582年10月14日(阳历)之间获得以秒为单位的时间增量?

时间:2016-05-20 17:47:42

标签: python datetime pandas spss

我试图将pandas数据帧转换为SPSS格式,并且在转换datetime64变量时遇到问题。

使用以下代码:

import pandas as pd

import datetime as dt

df['date1'] =  (df['date'] - pd.Timestamp('1582-10-15 00:00')).astype('timedelta64[s]')

df['date1'] = (df['date'] - dt.datetime(1582, 10, 15)).astype('timedelta64[s]')

我收到Out of bounds nanosecond timestamp: 1582-10-15 00:00:00错误。

当我尝试使用1982代替它时,它会起作用!

我知道从1582年到1970年以及时间等方面很难进入时代,但有一种简单的方法吗? 非常感谢你!

2 个答案:

答案 0 :(得分:1)

我相信Timestamp在很久以前的日期就已经破了,因为没有关于如何处理各种闰秒的记录,也没有记录到这一点。因此,您所获得的错误就是打破最精确的时间精度。那讲得通。它说它很久以前就不会那么准确了。

解决方案

请改用dt.datetime。它并不需要那么精确。

import pandas as pd

import datetime as dt

epoch = dt.datetime(1582, 10, 15)
date = dt.datetime(2016, 3, 31)

int((date - epoch).total_seconds())

答案 1 :(得分:1)

Timestamp limitations

使用来自docs的提示:

df = pd.DataFrame(pd.date_range('2016-01-01', periods=5, freq = 'D'), columns = ['date'])
df
Out[291]: 
        date
0 2016-01-01
1 2016-01-02
2 2016-01-03
3 2016-01-04
4 2016-01-05

# PeriodIndex:
pi = pd.PeriodIndex(df['date'].astype(str), freq='s')
pi
Out[293]: 
PeriodIndex(['2016-01-01 00:00:00', '2016-01-02 00:00:00',
             '2016-01-03 00:00:00', '2016-01-04 00:00:00',
             '2016-01-05 00:00:00'],
            dtype='int64', freq='S')

# Period:
p0 = pd.Period('1582-10-15 00:00', freq='s')
p0
Out[295]: Period('1582-10-15 00:00:00', 'S')

# Then this is an Int64Index (in seconds):
idx = pi - p0
idx
Out[296]: Int64Index([13670899200, 13670985600, 13671072000, 13671158400, 13671244800], dtype='int64')
# idx.values gives a numpy array