【问题标题】:Pandas Series: string date to epoch unix seconds熊猫系列:字符串日期到纪元 unix 秒
【发布时间】:2021-07-29 08:59:43
【问题描述】:

我有一个 Pandas 数据框,其中一列是字符串日期格式,如下所示

0               time
1  September 20 2016  
2  September 20 2016     
3  September 19 2016     
4  September 16 2016

将时间替换为纪元 unix 秒的简洁方法是什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用 Series 的 apply 方法修改列的值,方法是为其提供一个函数,其中包含您要对 每个 值执行的操作。

    为了处理日期时间,您可以使用dateutil.parser.parse 将任意字符串解析为日期时间对象。

    import datetime
    import pandas as pd
    from dateutil.parser import parse
    
    s = pd.Series(['September 20 2016',
    'September 20 2016',
    'September 19 2016',
    'September 16 2016'])
    df = pd.DataFrame(s)
    
    def dt2epoch(value):
        d = parse(value)
        return d.timestamp()
        
    df[0].apply(dt2epoch)  # apples given function to each value of column
    

    结果:

    0    1474329600
    1    1474329600
    2    1474243200
    3    1473984000
    Name: 0, dtype: float64
    

    【讨论】:

      【解决方案2】:

      你可以试试to_datetime

      import pandas as pd
      your_df['time']=pd.to_datetime(your_df['time'])
      

      编辑: 要从 datetime 对象获取纪元,您可以将系列转换为 int64 对象,这将为您提供自纪元以来的纳秒数,然后除以 10^9(一秒内的纳秒数)。

      import numpy as np
      your_df['time']  = (pd.to_datetime(your_df['time']).astype(np.int64)/10**9).astype(np.int64)
      

      如果您想将其转换为整数,则需要最后一次转换(除法将为您提供浮点数)

      注意:如果您的时间序列中有 NaT 对象,它们将显示为整数值 -9223372036,您可能希望预先过滤掉它们,或者将它们输出为 NaN(在这种情况下, 结果系列必须是浮点类型而不是 int)。

      【讨论】:

      • 我收到“未知字符串格式”错误;我正在使用 format='%B %d %Y' 参数,这似乎是正确的......
      • 对我来说,它适用于您上面的四个字符串。您是否可能在列中有一些不干净的数据,即一行或多行与字符串模式不匹配?
      • 啊,是的,我通过清理坏数据解决了格式错误,但是您上面的函数给了我一系列 Python 日期时间对象,而不是纪元秒数。
      • 该系列不应该包含普通的 python 日期时间对象,而应该是一个原生的 pandas 对象,它本质上是由一个表示自纪元以来的纳秒数的 int64 数组支持的。我添加了步骤来获取自纪元以来的秒数。
      猜你喜欢
      • 2019-12-09
      • 2019-07-21
      • 2015-07-19
      • 2017-01-27
      • 2019-08-21
      • 2019-06-16
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多