在熊猫中获取日期分位数

Jer*_*emy 10 python numpy pandas

我有一些看起来像这样的数据:

user  timestamp  value1 
   a 2007-01-01       7 
   a 2007-02-02       8 
   a 2007-02-03       9 
   b 2007-02-04       1 
   a 2007-02-05       2 
   b 2007-02-06       3 
   b 2007-02-07       4 
   a 2007-02-08       5 
...
Run Code Online (Sandbox Code Playgroud)

每个用户具有不同数量的条目.

我的目标是了解这些条目的生成速度,并输出如下内容:

     last_entry median_entry first_entry
user                                    
a    2007-02-08   2007-02-03  2007-01-01
b    2007-02-07   2007-02-06  2007-02-04
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的代码如下:

gb = df.groupby('user')
time_median = gb['timestamp'].median()
Run Code Online (Sandbox Code Playgroud)

但这给了我DataError: No numeric types to aggregate,大概是因为日期不是数字.

我想可以将日期转换为时间戳,并找到它们的中位数,然后将它们转回date_time对象.这是最好的方式吗?

Ste*_*fan 1

您可以为每个用户使用和.searchsorted()之间的一半天数:maxmin

df = pd.DataFrame(data={'user': np.random.choice(['a', 'b','c'], size=100, replace=True), 'value': np.random.random(size=100), 'time_stamp': pd.date_range(start=date(2016, 1,1), freq='D', periods=100)})

df.groupby('user')['time_stamp'].describe()

user        
a     count                      28
      unique                     28
      top       2016-02-03 00:00:00
      freq                        1
      first     2016-01-01 00:00:00
      last      2016-04-05 00:00:00
b     count                      38
      unique                     38
      top       2016-03-24 00:00:00
      freq                        1
      first     2016-01-02 00:00:00
      last      2016-04-08 00:00:00
c     count                      34
      unique                     34
      top       2016-01-28 00:00:00
      freq                        1
      first     2016-01-03 00:00:00
      last      2016-04-09 00:00:00
Run Code Online (Sandbox Code Playgroud)

对于中位数:

df.groupby('user')['time_stamp'].apply(lambda x: x.sort_values().iloc[x.searchsorted(x.min() + (x.max()-x.min())/2)])

dtype: object
user    
a     54   2016-02-24
b     50   2016-02-20
c     51   2016-02-21
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)