Python 如何获取datetime64列和1582年10月14日(公历)之间的时间差(以秒为单位)?
我正在尝试将pandas dataframe转换为SPSS格式,但在转换datetime64变量时遇到问题 使用以下代码:Python 如何获取datetime64列和1582年10月14日(公历)之间的时间差(以秒为单位)?,python,datetime,pandas,spss,Python,Datetime,Pandas,Spss,我正在尝试将pandas dataframe转换为SPSS格式,但在转换datetime64变量时遇到问题 使用以下代码: import pandas as pd import datetime as dt df['date1'] = (df['date'] - pd.Timestamp('1582-10-15 00:00')).astype('timedelta64[s]') 或 我得到超限纳秒时间戳:1582-10-15 00:00:00错误 当我只是为了好玩而尝试使用1982时,它
import pandas as pd
import datetime as dt
df['date1'] = (df['date'] - pd.Timestamp('1582-10-15 00:00')).astype('timedelta64[s]')
或
我得到超限纳秒时间戳:1582-10-15 00:00:00
错误
当我只是为了好玩而尝试使用1982时,它是有效的
我知道从1582年到1970年以及utc时间等时间段要进入新纪元是很困难的,但有简单的方法吗?
多谢各位 我相信
时间戳
会在这么早的日期中断,因为没有关于如何处理各种闰秒的记录,也没有什么记录。所以你得到的错误是时间最精确的分解。这是有道理的。这是说,对于这么久以前的一个日期来说,它不可能那么精确
解决方案
改用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())
使用来自以下方面的提示进行一些黑客攻击:
请参阅以了解如何处理越界时间df['epoch']=dt.datetime(1582,10,14)/df['date2']=int((df['date']-df['epoch'])。total_seconds()给出了相同的错误:越界时间:越界纳秒时间:1582-10-14 00:00:00我使用的解决方案是:df['DELTA_secs']=(dt.datetime(1970,1,1)-dt.datetime(1582,10,14)).total_seconds()df['date0']=(df['date']-dt.datetime(1970,1,1)).astype('timedelta64[s]')df['date2']=df['xxdate0']+df['DELTA_secs']df=df.drop(['DELTA_secs','date0',1)”,因此您得到的错误是对最精确时间的分解。”#在数百年的时间里精确到几秒钟,但不包括位置。。。
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())
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