我试图将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年以及时间等方面很难进入时代,但有一种简单的方法吗? 非常感谢你!
答案 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)
使用来自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