【问题标题】:percentile for datetime column python日期时间列python的百分位数
【发布时间】:2018-01-26 00:20:35
【问题描述】:

有没有一种方法可以计算具有日期时间格式的数据框列的百分位数,同时仍保留日期时间格式 (Y-m-d H:M:S) 并且不将百分位值转换为秒? 日期时间格式的数据示例

df: 
0   2016-07-31 08:00:00
1   2016-07-30 14:30:00
2   2006-06-24 14:15:00
3   2016-07-15 08:15:45
4   2016-08-01 23:50:00

【问题讨论】:

    标签: python pandas datetime percentile


    【解决方案1】:

    有一个内置函数quantile 可用于此目的。让

    df = pd.Series(['2016-07-31 08:00:00', '2016-07-30 14:30:00', '2006-06-24 14:15:00', '2016-07-15 08:15:45', '2016-08-01 23:50:00'])
    df
    0   2016-07-31 08:00:00
    1   2016-07-30 14:30:00
    2   2006-06-24 14:15:00
    3   2016-07-15 08:15:45
    4   2016-08-01 23:50:00
    

    然后

    >>> df.quantile(0.5)
    Timestamp('2016-07-30 14:30:00')
    

    另见官方文档

    https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.quantile.html

    【讨论】:

      【解决方案2】:

      describe() datetime 列的方法与整数列或浮点列的工作方式不同

      所以我们可以创建自定义方法来做同样的事情:

      import pandas as pd
      from datetime import timedelta
      from datetime import datetime
      
      base = datetime.now()
      date_list = [base - timedelta(days=x) for x in range(0, 20)]    
      df = pd.DataFrame.from_dict({'Date': date_list})
      
      df
      
                                Date
      0   2017-08-17 21:32:54.044948
      1   2017-08-16 21:32:54.044948
      2   2017-08-15 21:32:54.044948
      3   2017-08-14 21:32:54.044948
      
      def describe_datetime(dataframe, column, percentiles=[i/10 for i in range(1,11)]):
          new_date = dataframe[column].dt.strftime('%Y-%m-%d').sort_values().values
          length = len(new_date)
          for percentile in percentiles:
              print(percentile, ':', new_date[int(percentile * length)-1])
      
      describe_datetime(df, 'Date')
      

      输出:

      0.1 : 2017-07-30
      0.2 : 2017-08-01
      0.3 : 2017-08-03
      0.4 : 2017-08-05
      0.5 : 2017-08-07
      0.6 : 2017-08-09
      0.7 : 2017-08-11
      0.8 : 2017-08-13
      0.9 : 2017-08-15
      1.0 : 2017-08-17
      

      【讨论】:

      • 这种方法在我尝试的时候不起作用。我也尝试改变百分位数,返回的值是相同的。
      • @T-Jay 我已经创建了一个自定义方法来做你想要的。
      【解决方案3】:

      在尝试了一些代码之后。我能够使用下面的代码计算百分位数,我对列进行了排序并使用它的索引来计算百分位数。 数据框是'df',日期时间格式的列是'dates'

      date_column = list(df.sort_values('dates')['dates'])
      index = range(0,len(date_column)+1)
      date_column[np.int((np.percentile(index, 50)))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-30
        • 2019-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-04
        相关资源
        最近更新 更多