python pandas 日期_Python Pandas系列日期从秒到秒

Following in the spirit of this answer, I attempted the following to convert a DataFrame column of datetimes to a column of seconds since the epoch.

df['date'] = (df['date']+datetime.timedelta(hours=2)-datetime.datetime(1970,1,1))

df['date'].map(lambda td:td.total_seconds())

The second command causes the following error which I do not understand. Any thoughts on what might be going on here? I replaced map with apply and that didn't help matters.

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

in ()

----> 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)()

in (td)

----> 1 df['date'].map(lambda td:td.total_seconds())

AttributeError: 'float' object has no attribute 'total_seconds'

解决方案

Update:

In 0.15.0 Timedeltas became a full-fledged dtype.

So this becomes possible (as well as the methods below)

In [45]: s = Series(pd.timedelta_range('1 day',freq='1S',periods=5))

In [46]: s.dt.components

Out[46]:

days hours minutes seconds milliseconds microseconds nanoseconds

0 1 0 0 0 0 0 0

1 1 0 0 1 0 0 0

2 1 0 0 2 0 0 0

3 1 0 0 3 0 0 0

4 1 0 0 4 0 0 0

In [47]: s.astype('timedelta64[s]')

Out[47]:

0 86400

1 86401

2 86402

3 86403

4 86404

dtype: float64

Original Answer:

I see that you are on master (and 0.13 is coming out very shortly),

so assuming you have numpy >= 1.7. Do this. See here for the docs (this is frequency conversion)

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

The contained values are np.timedelta64[ns] objects, they don't have the same methods as timedelta objects, so no total_seconds().

In [10]: s = (df['date']+timedelta(hours=2)-datetime.datetime(1970,1,1))

In [11]: s[0]

Out[11]: numpy.timedelta64(1357005600000000000,'ns')

You can astype them to int, and you get back a ns unit.

In [12]: s[0].astype(int)

Out[12]: 1357005600000000000

You can do this as well (but only on an individual unit element).

In [18]: s[0].astype('timedelta64[s]')

Out[18]: numpy.timedelta64(1357005600,'s')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值