Python从新纪元开始将一系列的日期时间延长到秒

Python从新纪元开始将一系列的日期时间延长到秒,python,datetime,pandas,Python,Datetime,Pandas,本着的精神,我尝试将datetimes的DataFrame列转换为自纪元以来的秒列 df['date'] = (df['date']+datetime.timedelta(hours=2)-datetime.datetime(1970,1,1)) df['date'].map(lambda td:td.total_seconds()) 第二个命令导致以下错误,我不理解。你有什么想法吗?我用apply替换了map,但这并没有起到任何作用 -----------------------------

本着的精神,我尝试将datetimes的DataFrame列转换为自纪元以来的秒列

df['date'] = (df['date']+datetime.timedelta(hours=2)-datetime.datetime(1970,1,1))
df['date'].map(lambda td:td.total_seconds())
第二个命令导致以下错误,我不理解。你有什么想法吗?我用apply替换了map,但这并没有起到任何作用

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-99-7123e823f995> in <module>()
----> 1 df['date'].map(lambda td:td.total_seconds())

/Users/cpd/.virtualenvs/py27-ipython+pandas/lib/python2.7/site-packages/pandas-0.12.0_937_gb55c790-py2.7-macosx-10.8-x86_64.egg/pandas/core/series.pyc in map(self, arg, na_action)
   1932             return self._constructor(new_values, index=self.index).__finalize__(self)
   1933         else:
-> 1934             mapped = map_f(values, arg)
   1935             return self._constructor(mapped, index=self.index).__finalize__(self)
   1936 

/Users/cpd/.virtualenvs/py27-ipython+pandas/lib/python2.7/site-packages/pandas-0.12.0_937_gb55c790-py2.7-macosx-10.8-x86_64.egg/pandas/lib.so in pandas.lib.map_infer (pandas/lib.c:43628)()

<ipython-input-99-7123e823f995> in <lambda>(td)
----> 1 df['date'].map(lambda td:td.total_seconds())

AttributeError: 'float' object has no attribute 'total_seconds'
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在()
---->1 df['date'].map(λtd:td.total_seconds())
/Users/cpd/.virtualenvs/py27 ipython+pandas/lib/python2.7/site-packages/pandas-0.12.0937_gb55c790-py2.7-macosx-10.8-x8664.egg/pandas/core/series.pyc in map(self,arg,na_action)
1932返回self.\u构造函数(新的值,索引=self.index)。\uuuuu最终确定(self)
1933年其他:
->1934映射=映射f(值,arg)
1935返回self.\u构造函数(已映射,索引=self.index)。\uuuu完成\uuuu(self)
1936
/Users/cpd/.virtualenvs/py27 ipython+pandas/lib/python2.7/site-packages/pandas-0.12.0937_gb55c790-py2.7-macosx-10.8-x8664.egg/pandas/lib.so in pandas.lib.map_infere(pandas/lib.c:43628)()
运输署署长
---->1 df['date'].map(λtd:td.total_seconds())
AttributeError:“float”对象没有“total_seconds”属性
更新:

在0.15.0
timedelta
中成为一种成熟的数据类型

因此这成为可能(以及下面的方法)

原始答复:

我看到你是大师(0.13很快就要出来了), 假设numpy>=1.7。这样做。文档请参见(这是频率转换)

包含的值是
np.timedelta64[ns]
对象,它们的方法与
timedelta
对象不同,因此没有
total_seconds()

您可以将它们键入int,然后返回一个
ns
单元

In [12]: s[0].astype(int)
Out[12]: 1357005600000000000
您也可以这样做(但仅限于单个单元元素)


“date”列可能不是datetime64?该列是否包含任何缺少的值?缺少的值通常会导致pandas系列被转换为浮动,当您试图将其解释为datetimes时,会造成奇怪的情况。@Abe确实您是对的。结果发现有些记录中缺少一些数据。不是我预期的。。。好的,杰夫,谢谢你!一旦我清除了丢失数据的行,我就可以直接将其应用于新问题。;-)您不需要删除缺少的值(NaT);它们将被返回,因为nanI现在没有时间编辑(并重新验证)答案,但实际上0.13版现在允许对整个系列应用“astype”操作。请参阅或,并在第页上查找“aType”。我正在搜索一种方法,将
时间增量的
系列
转换为
,以便打印。您使用
/pd.Timedelta(秒=1)
的方法很好。斯蒂尔,我想知道是否有更好的方法。你觉得呢?这个答案其实已经过时了;TimeDelta在0.15.0中成为成熟的类型。我将添加另一种方法。
In [5]: df = DataFrame(dict(date = date_range('20130101',periods=10)))

In [6]: df
Out[6]: 
                 date
0 2013-01-01 00:00:00
1 2013-01-02 00:00:00
2 2013-01-03 00:00:00
3 2013-01-04 00:00:00
4 2013-01-05 00:00:00
5 2013-01-06 00:00:00
6 2013-01-07 00:00:00
7 2013-01-08 00:00:00
8 2013-01-09 00:00:00
9 2013-01-10 00:00:00

In [7]: df['date']+timedelta(hours=2)-datetime.datetime(1970,1,1)
Out[7]: 
0   15706 days, 02:00:00
1   15707 days, 02:00:00
2   15708 days, 02:00:00
3   15709 days, 02:00:00
4   15710 days, 02:00:00
5   15711 days, 02:00:00
6   15712 days, 02:00:00
7   15713 days, 02:00:00
8   15714 days, 02:00:00
9   15715 days, 02:00:00
Name: date, dtype: timedelta64[ns]

In [9]: (df['date']+timedelta(hours=2)-datetime.datetime(1970,1,1)) / np.timedelta64(1,'s')
Out[9]: 
0    1357005600
1    1357092000
2    1357178400
3    1357264800
4    1357351200
5    1357437600
6    1357524000
7    1357610400
8    1357696800
9    1357783200
Name: date, dtype: float64
In [10]: s = (df['date']+timedelta(hours=2)-datetime.datetime(1970,1,1))

In [11]: s[0]
Out[11]: numpy.timedelta64(1357005600000000000,'ns')
In [12]: s[0].astype(int)
Out[12]: 1357005600000000000
In [18]: s[0].astype('timedelta64[s]')
Out[18]: numpy.timedelta64(1357005600,'s')