代码之家  ›  专栏  ›  技术社区  ›  kamome

熊猫约会时间系列的平均小时数是多少?[副本]

  •  0
  • kamome  · 技术社区  · 6 年前

    我有一个datetime属性:

    d = {
        'DOB': pd.Series([
            datetime.datetime(2014, 7, 9),
            datetime.datetime(2014, 7, 15),
            np.datetime64('NaT')
        ], index=['a', 'b', 'c'])
    }
    df_test = pd.DataFrame(d)
    

    我想计算这个属性的平均值。运行mean()会导致错误:

    TypeError:此数据类型不允许还原操作“mean”

    我也尝试了提出的解决方案 elsewhere . 它不像运行在那里提出的函数那样工作

    溢出错误:Python int太大,无法转换为C long

    你有什么建议?上述数据帧的结果应等于

    datetime.datetime(2014, 7, 12).
    
    0 回复  |  直到 7 年前
        1
  •  7
  •   piRSquared    7 年前

    你可以接受 Timedelta . 所以找到最小值,从级数中减去它,得到一个级数 时间增量 . 然后取平均值,再加回到最小值。

    dob = df_test.DOB
    m = dob.min()
    (m + (dob - m).mean()).to_pydatetime()
    
    datetime.datetime(2014, 7, 12, 0, 0)
    

    一行

    df_test.DOB.pipe(lambda d: (lambda m: m + (d - m).mean())(d.min())).to_pydatetime()
    

    @ALollz point

    我用纪元 pd.Timestamp(0) 而不是 min

    df_test.DOB.pipe(lambda d: (lambda m: m + (d - m).mean())(pd.Timestamp(0))).to_pydatetime()
    
        2
  •  5
  •   Scott Boston    7 年前

    可以使用 astype 与np.int64型并使用 pd.to_datetime :

    pd.to_datetime(df_test.DOB.dropna().astype(np.int64).mean())
    

    输出:

    Timestamp('2014-07-12 00:00:00')
    
        3
  •  2
  •   ALollz    7 年前

    你可以一起工作 unix 如果你愿意的话。这被定义为自 1970-01-01 . 这样,所有的时间都是简单的浮点数,所以很容易对列进行简单的数学运算。

    import pandas as pd
    
    df_test['unix_time'] = (df_test.DOB - pd.to_datetime('1970-01-01')).dt.total_seconds()
    
    df_test['unix_time'].mean()
    #1405123200.0
    
    # You want it in date, so just convert back
    pd.to_datetime(df_test['unix_time'].mean(), origin='unix', unit='s')
    #Timestamp('2014-07-12 00:00:00')
    
        4
  •  0
  •   Metropolis    7 年前

    Datetime math支持一些标准操作:

    a = datetime.datetime(2014, 7, 9)
    b = datetime.datetime(2014, 7, 15)
    c = (b - a)/2
    
    # here c will be datetime.timedelta(3)
    
    a + c
    Out[7]: datetime.datetime(2014, 7, 12, 0, 0)
    

    因此,您可以编写一个函数,给定两个datetimes,从较大值中减去较小值,然后将差值的一半加到较小值中。将此函数应用于您的数据帧,然后执行shazam!

        5
  •  0
  •   Blane    5 年前

    当pandas=0.25时,可以计算日期时间序列的平均值。

    In [1]: import pandas as pd
       ...: import numpy as np
    
    In [2]: s = pd.Series([
       ...:     pd.datetime(2014, 7, 9),
       ...:     pd.datetime(2014, 7, 15),
       ...:     np.datetime64('NaT')])
    
    In [3]: s.mean()
    Out[3]: Timestamp('2014-07-12 00:00:00')
    

    但是,请注意,将mean应用于pandas数据帧当前会忽略具有日期时间序列的列。

    推荐文章