【问题标题】:pandas convert from datetime to integer timestamp熊猫从日期时间转换为整数时间戳
【发布时间】:2019-01-22 16:43:25
【问题描述】:

考虑到 python 中的 pandas 数据框有一个名为 time 的整数类型的列,我可以使用以下指令将其转换为 datetime 格式。

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

所以现在该列有如下条目:2019-01-15 13:25:43

将字符串恢复为整数时间戳值(表示从1970-01-01 00:00:00 开始经过的秒数)的命令是什么?

我检查了pandas.Timestamp,但找不到转换实用程序,我无法为此使用pandas.to_timedelta

这种转换有什么实用工具吗?

【问题讨论】:

标签: python pandas timestamp datetime-conversion


【解决方案1】:

您可以使用 astype(int) 将其类型转换为 int 并将其除以 10**9 以获得 unix 纪元开始的秒数。

import pandas as pd
df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})
df_unix_sec = pd.to_datetime(df['time']).astype(int)/ 10**9
print(df_unix_sec)

【讨论】:

  • 这太棒了,但它没有给出预期的结果:我尝试了以下几行:df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})df['time'] = pandas.to_datetime(df['time'], unit='s',origin='unix') 它没有返回任何错误,但我看不到列中的任何变化
  • Psst,我的答案是转换为 int ;-)
  • @FrancescoBoi 实际上最初我误解了 to_datetime 参数。看看我还在stackoverflow.com/questions/54313463/… 上问了一个关于 SO 的问题。因此,如果您将其转换为int,那么它将为您工作:)
  • 好吧,如果你可以加,你需要除以 10 ** 9 来得到一个 nix 时间戳,那我就删除我的答案。
  • 因为我在除以10**9 后得到一个浮点类型,所以我认为最好添加另一个演员:res = (pd.to_datetime(df['time'], unit='s').astype(int)/10**9).astype(int)
【解决方案2】:

最简单的方法是使用.value

pd.to_datetime('1970-01-01').value

如果你想将其应用于整个列,只需使用.apply

df['time'] = df['time'].apply(lambda x: x.value)

【讨论】:

    【解决方案3】:

    timedelta64 上使用.dt.total_seconds()

    import pandas as pd
    df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})
    
    # pd.to_timedelta(df.time).dt.total_seconds() # Is deprecated
    (df.time - pd.to_datetime('1970-01-01')).dt.total_seconds()
    

    输出

    0    1.547559e+09
    Name: time, dtype: float64
    

    【讨论】:

      【解决方案4】:

      正如@Ignacio 建议的那样,这就是我用来转换为整数的方法:

      df['time'] = df['time'].apply(lambda x: x.value)
      

      然后,把它拿回来:

      df['time'] = df['time'].apply(pd.Timestamp)
      

      【讨论】:

        【解决方案5】:

        也可以使用.view(...):

        import pandas as pd
        df = pd.DataFrame({'time': [pd.to_datetime('2019-01-15 13:25:43')]})
        df_unix_sec = pd.to_datetime(df['time']).view(int) // 10 ** 9
        print(df_unix_sec)
        

        上面推荐的.astype(int) 铸造是deprecated in pandas 1.3.0,并引发警告:

        FutureWarning: casting datetime64[ns] values to int64 with .astype(...) is deprecated and will raise in a future version. Use .view(...) instead.
        

        【讨论】:

          猜你喜欢
          • 2018-09-23
          • 2017-12-12
          • 2020-01-27
          • 1970-01-01
          • 1970-01-01
          • 2017-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多