在datetime和Pandas Timestamp对象之间进行转换

116

我有以下内容:

> date1
Timestamp('2014-01-23 00:00:00', tz=None)

> date2
datetime.date(2014, 3, 26)

我在这篇回答上读到,可以使用pandas.to_datetime()Timestamps转换为datetime对象,但它似乎不起作用:

> pd.to_datetime(date1)   
Timestamp('2014-01-23 00:00:00', tz=None)

为什么?我该如何在这两种格式之间进行转换?

4个回答

161
你可以使用 to_pydatetime 方法来更加明确:

你可以使用 to_pydatetime 方法来更加明确:

In [11]: ts = pd.Timestamp('2014-01-23 00:00:00', tz=None)

In [12]: ts.to_pydatetime()
Out[12]: datetime.datetime(2014, 1, 23, 0, 0)

它也可以在DatetimeIndex上使用:

In [13]: rng = pd.date_range('1/10/2011', periods=3, freq='D')

In [14]: rng.to_pydatetime()
Out[14]:
array([datetime.datetime(2011, 1, 10, 0, 0),
       datetime.datetime(2011, 1, 11, 0, 0),
       datetime.datetime(2011, 1, 12, 0, 0)], dtype=object)

2
谢谢。你知道to_datetime()to_pydatetime()之间的区别以及为什么将Timestamp对象传递给类方法pd.to_datetime不起作用吗? - Amelio Vazquez-Reina
1
@user815423426 它适用于全局名称函数(pd.to_datetime(ts))... 不同之处在于to_pydatetime返回一个datetime :) - Andy Hayden
3
这个答案似乎不再有效。 - szeitlin

29

Pandas Timestamp 转换为 datetime.datetime:

pd.Timestamp('2014-01-23 00:00:00', tz=None).to_pydatetime()

将datetime.datetime转换为Timestamp

pd.Timestamp(datetime(2014, 1, 23))

10
>>> pd.Timestamp('2014-01-23 00:00:00', tz=None).to_datetime()
datetime.datetime(2014, 1, 23, 0, 0)
>>> pd.Timestamp(datetime.date(2014, 3, 26))
Timestamp('2014-03-26 00:00:00')

1
谢谢 - 我猜应该将 to_datetime 作为对象方法运行,而不是作为类方法,但是为什么? - Amelio Vazquez-Reina
12
似乎与其名称相反,pd.to_datetime 总是返回 Timestamp - behzad.nouri
6
不适用于Pandas 0.24版本。错误信息为“'Timestamp'对象没有'to_datetime'属性”。 - Phoenix
3
@Phoenix,你要找的方法是 to_pydatetime() - Keiron Stoddart

-1

回答如何从现有的Python datetime 转换成Pandas Timestamp 的问题,可以按照以下步骤进行:

    import time, calendar, pandas as pd
    from datetime import datetime
    
    def to_posix_ts(d: datetime, utc:bool=True) -> float:
        tt=d.timetuple()
        return (calendar.timegm(tt) if utc else time.mktime(tt)) + round(d.microsecond/1000000, 0)
    
    def pd_timestamp_from_datetime(d: datetime) -> pd.Timestamp:
        return pd.to_datetime(to_posix_ts(d), unit='s')
    
    dt = pd_timestamp_from_datetime(datetime.now())
    print('({}) {}'.format(type(dt), dt))

输出:

(<class 'pandas._libs.tslibs.timestamps.Timestamp'>) 2020-09-05 23:38:55

我希望有一种更优雅的方式来完成这个任务,但是to_posix_ts已经在我的标准工具链中了,所以我会继续前进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接