Python 获取给定日期的gps周数

Python 获取给定日期的gps周数,python,datetime,numpy,pandas,timedelta,Python,Datetime,Numpy,Pandas,Timedelta,我有以下熊猫系列,希望获得该日期的GPS周数: import pandas as pd from pandas import Timestamp times = pd.Series([Timestamp('2015-11-27 00:00:00.540000'), Timestamp('2015-11-27 00:00:00.699000'), Timestamp('2015-11-27 00:00:01'), Timestamp('2015-11-27 00:00:01.699000'), T

我有以下熊猫系列,希望获得该日期的GPS周数:

import pandas as pd
from pandas import Timestamp
times = pd.Series([Timestamp('2015-11-27 00:00:00.540000'), Timestamp('2015-11-27 00:00:00.699000'), Timestamp('2015-11-27 00:00:01'), Timestamp('2015-11-27 00:00:01.699000'), Timestamp('2015-11-27 00:00:02.699000')])

In [116]: times
Out[116]:
0   2015-11-27 00:00:00.540
1   2015-11-27 00:00:00.699
2   2015-11-27 00:00:01.000
3   2015-11-27 00:00:01.699
4   2015-11-27 00:00:02.699
Name: GMT, dtype: datetime64[ns]
当我试图减去GPS历元开始的日期并得到总秒数时,我得到:

gps_epoch = datetime.datetime(1980, 1, 6)
delta = times - gps_epoch

In [120]: delta
Out[120]:
0   13109 days 00:00:00.540000
1   13109 days 00:00:00.699000
2          13109 days 00:00:01
3   13109 days 00:00:01.699000
4   13109 days 00:00:02.699000
Name: GMT, dtype: timedelta64[ns]
我正在尝试映射该系列的hovewer的
total_seconds
,我有一个错误:

In [124]: delta.map(lambda x: x.total_seconds())
AttributeError: 'numpy.timedelta64' object has no attribute 'total_seconds'
但当我试图获得第一个元素的总秒数时,一切都很好:

In [130]: delta[0].total_seconds()
Out[130]: 1132617600.54
然后,为了获得GPS周数,我可以执行以下操作:

In [135]: np.floor(delta[0].total_seconds()/86400/7)
Out[135]: 1872.0
In [97]:
type(delta[0])

Out[97]:
pandas.tslib.Timedelta

In [100]:    
delta[[0]].map(lambda x: print(type(x)))

<class 'numpy.timedelta64'>
Out[100]:
0    None
dtype: object
我已经检查了这两种情况的类型,它们是不同的..:

In [137]: type(delta[0])
Out[137]: pandas.tslib.Timedelta

In [138]: delta.map(lambda x: type(x))
Out[138]:
0    <class 'numpy.timedelta64'>
1    <class 'numpy.timedelta64'>
2    <class 'numpy.timedelta64'>
3    <class 'numpy.timedelta64'>
4    <class 'numpy.timedelta64'>
Name: GMT, dtype: object
[137]中的
:类型(增量[0])
Out[137]:pandas.tslib.Timedelta
In[138]:delta.map(lambda x:type(x))
出[138]:
0
1.
2.
3.
4.
名称:GMT,数据类型:object
问题是为什么它不使用
map
方法以及为什么类型不同?

您可以执行以下操作:

以及:

或使用
floordiv

In [84]:
delta.dt.total_seconds().floordiv(86400).floordiv(7)

Out[84]:
0    1872
1    1872
2    1872
3    1872
4    1872
dtype: float64
出现此错误的原因是
dtype
被转换为
np.timedelta
,它没有
totalseconds
属性,而pandas
timedelta
则有此属性(因为它是
datetime.timedelta
的子类),请参见:

考虑以下几点:

In [135]: np.floor(delta[0].total_seconds()/86400/7)
Out[135]: 1872.0
In [97]:
type(delta[0])

Out[97]:
pandas.tslib.Timedelta

In [100]:    
delta[[0]].map(lambda x: print(type(x)))

<class 'numpy.timedelta64'>
Out[100]:
0    None
dtype: object
[97]中的

类型(增量[0])
出[97]:
pandas.tslib.Timedelta
在[100]中:
delta[[0]].map(λx:print(type(x)))
出[100]:
0无
数据类型:对象

这样做可能是为了提供与
np
方法的兼容性,但是您可以使用
dt.totalseconds
作为一个方便的例程不
delta.dt.total_seconds()
有效吗?谢谢。我错过了这个功能。但是关于类型转换还是很有趣的,你对此有什么想法吗?不确定,我正在试图弄清楚这可能是
np.datetime64
模块版本的问题,我的是
1.9.3
,如果我这样做
d=np.datetime64('2009-01-01')-np.datetime64('2008-01-01')d.totalseconds()
我得到了同样的错误我的numpy版本是
1.10.1
实际上这不是因为pandas
Timedelta
子类python
datetime.Timedelta
并且与
np.Timedelta
兼容,后者没有
totalseconds
属性,但是
dt.timddelta
有属性吗?请参阅:这段代码也有效:
d=dt.datetime.now()-dt.datetime(2015,1,1)d.total_seconds()