【问题标题】:Converting pandas.tslib.Timestamp to datetime python将 pandas.tslib.Timestamp 转换为 datetime python
【发布时间】:2014-11-09 05:10:32
【问题描述】:

我有一个df 时间序列。我提取了索引并希望将它们分别转换为datetime。你怎么做呢?我尝试使用pandas.to_datetime(x),但在使用type() 后检查时它没有转换它

【问题讨论】:

标签: python pandas


【解决方案1】:

试试to_pydatetime()

>>> import pandas as pd
>>> t = pd.tslib.Timestamp('2016-03-03 00:00:00')
>>> type(t)
pandas.tslib.Timestamp
>>> t.to_pydatetime()
datetime.datetime(2016, 3, 3, 0, 0)

改成datetime.date类型

>>> t.date()
datetime.date(2016, 3, 3)

【讨论】:

  • 注:pd.to_datetime() 现已折旧,pd.to_pydatetime() 是新标准
【解决方案2】:

在我的情况下,即使指定格式,我也无法得到正确的输出:我过去总是得到 1970 年。

实际上解决我的问题的方法是为函数指定unit 参数,因为我的时间戳具有秒粒度:

df_new = df
df_new['time'] = pandas.to_datetime(df['time'], unit='s')

【讨论】:

    【解决方案3】:

    如果您有两个单独的字段(一个用于日期;一个用于时间),作为替代解决方案:

    转换为datetime.date

    df['date2'] = pd.to_datetime(df['date']).apply(lambda x: x.date())
    

    转换为datetime.time

    df['time2'] = pd.to_datetime(df['time']).apply(lambda x: x.time())
    

    之后你可以组合它们

    df['datetime'] = df.apply(lambda r : pd.datetime.combine(r['date2'],r['time2']),1)
    

    改编自this post

    【讨论】:

      【解决方案4】:

      您可以使用 to_pydatetime() 将 Timestamp 转换为 Python 日期时间对象,但似乎当应用于整个列时,转换会被阻止:

      >>> ts = pd.tslib.Timestamp.now()
      >>> type(ts)
      <class 'pandas._libs.tslibs.timestamps.Timestamp'>
      >>> type(ts.to_pydatetime())
      <class 'datetime.datetime'>
      >>> df = pd.DataFrame({"now": [datetime.datetime.utcnow()] * 10})
      >>> type(df['now'].iloc[0])
      <class 'pandas._libs.tslibs.timestamps.Timestamp'>
      >>> df['now2'] = df['now'].apply(lambda dt: dt.to_pydatetime())
      >>> type(df['now2'].iloc[0])
      <class 'pandas._libs.tslibs.timestamps.Timestamp'>
      

      不知道该怎么做。 (在某些情况下,Pandas 的 Timestamp 对象并不是 Python 的 datetime 对象的完美替代品,而您需要真实的东西。)

      【讨论】:

        【解决方案5】:

        只是对问题的更新,我尝试了最受好评的答案,它给了我这个警告

        usr/local/lib/python3.5/dist-packages/IPython/core/interactiveshell.py:2910:FutureWarning:to_datetime 已弃用。使用 self.to_pydatetime() exec(code_obj, self.user_global_ns, self.user_ns)

        并建议我使用to_pydatetime()

        例如

        sample = Timestamp('2018-05-02 10:08:54.774000')

        sample.to_datetime() 将返回 datetime.datetime(2018, 4, 30, 10, 8, 54, 774000)

        【讨论】:

        • 感谢您的提醒,莫里斯。看起来这是一个警告,而不是错误,除非它阻止代码运行。
        【解决方案6】:

        这对我有用,要在 MySQL 中为 insert 创建日期,请尝试:

        pandas_tslib = pandas_tslib.to_pydatetime()
        pandas_tslib = "'" + pandas_tslib.strftime('%Y-%m-%d') + "'"
        

        【讨论】:

          【解决方案7】:
          import time
          time.strftime("%H:%M",  time.strptime(str(x), "%Y-%m-%d %H:%M:%S"))
          

          注意:x 应该是 pandas.tslib.Timestamp(因为它在问题中)

          【讨论】:

            【解决方案8】:

            我遇到了同样的问题,并尝试了 @aikramer2 的解决方案,向我的 df 类型“datetime.datetime”添加一列,但我又得到了一个 pandas 数据类型:

            #libraries used -
            import pandas as pd
            import datetime as dt
            
            #loading data into a pandas df, from a local file. note column [1] contains a datetime column -
            savedtweets = pd.read_csv('/Users/sharon/Documents/ipython/twitter_analysis/conftwit.csv', sep='\t', 
                                  names=['id', 'created_at_string', 'user.screen_name', 'text'], 
                                  parse_dates={"created_at" : [1]})
            print int(max(savedtweets['id'])) #535073416026816512
            print type(savedtweets['created_at'][0]) # result is <class 'pandas.tslib.Timestamp'>
            
            # add a column specifically using datetime.datetime library -
            savedtweets['datetime'] = savedtweets['created_at'].apply(lambda x: dt.datetime(x.year,x.month,x.day))
            print type(savedtweets['datetime'][0]) # result is <class 'pandas.tslib.Timestamp'>
            

            我怀疑 pandas df 无法存储 datetime.datetime 数据类型。当我创建一个普通的 python 列表来存储 datetime.datetime 值时,我获得了成功:

            savedtweets = pd.read_csv('/Users/swragg/Documents/ipython/twitter_analysis/conftwit.csv', sep='\t', 
                                  names=['id', 'created_at_string', 'user.screen_name', 'text'], 
                                  parse_dates={"created_at" : [1]})
            print int(max(savedtweets['id'])) #535073416026816512
            print type(savedtweets['created_at'][0]) # <class 'pandas.tslib.Timestamp'>
            savedtweets_datetime= [dt.datetime(x.year,x.month,x.day,x.hour,x.minute,x.second) for x in savedtweets['created_at']]
            print savedtweets_datetime[0] # 2014-11-19 14:13:38
            print savedtweets['created_at'][0] # 2014-11-19 14:13:38
            print type(dt.datetime(2014,3,5,2,4)) # <type 'datetime.datetime'>
            print type(savedtweets['created_at'][0].year) # <type 'int'>
            print type(savedtweets_datetime) # <type 'list'>
            

            【讨论】:

            • 这是我的解决方案。干得好。
            【解决方案9】:

            假设您正在尝试转换 pandas 时间戳对象,您可以从时间戳中提取相关数据:

            #Create the data
            data = {1: tslib.Timestamp('2013-01-03 00:00:00', tz=None), 2: tslib.Timestamp('2013-01-04 00:00:00', tz=None), 3: tslib.Timestamp('2013-01-03 00:00:00', tz=None)}
            
            #convert to df
            df = pandas.DataFrame.from_dict(data, orient = 'index')
            df.columns = ['timestamp']
            
            #generate the datetime
            df['datetime'] = df['timestamp'].apply(lambda x: datetime.date(x.year,x.month,x.day))
            

            当然,如果您需要秒、分钟和小时,也可以将它们作为函数 datetime.datetime 的参数。

            【讨论】:

            • 这似乎只是一种解决方法,请参阅@alexander-yau 的答案以获得真正的解决方案
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-19
            • 1970-01-01
            • 2012-01-18
            • 2023-02-10
            • 1970-01-01
            相关资源
            最近更新 更多