【问题标题】:De-aggregating a table and randomizing datetime取消聚合表并随机化日期时间
【发布时间】:2021-11-02 04:11:53
【问题描述】:

我有一个具有以下结构的表;每次用户在该日期再次访问应用程序时,count 列都会更新。

user_id date count
1 1/1/2021 4
2 1/1/2021 7
1 1/2/2021 3
3 1/2/2021 10
2 1/3/2021 4
4 1/1/2021 12

我想根据 count 对这些数据进行去聚合,例如,user_id of 1 将在 2021 年 1 月 1 日有四个记录,而没有 count 列。之后,我想将随机时间连接到日期。我的输出是这样的:

user_id date_time
1 1/1/2021 16:00:21
1 1/1/2021 7:23:55
1 1/1/2021 12:01:45
1 1/1/2021 21:21:07

我正在为此使用熊猫。我认为随机化时间戳很简单,只是根据列去聚合数据对我来说有点棘手。

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以复制索引并添加 0 到 24 小时之间的随机时间:

(df.loc[df.index.repeat(df['count'])]
   .assign(date=lambda d: pd.to_datetime(d['date'])
                         +pd.to_timedelta(np.random.randint(0,24*3600, size=len(d)), unit='s'))
   .rename({'date': 'date_time'})
   .drop('count', axis=1)
)

输出:

   user_id                date
0        1 2021-01-01 03:32:40
0        1 2021-01-01 03:54:18
0        1 2021-01-01 00:57:49
0        1 2021-01-01 13:04:08
1        2 2021-01-01 00:34:03
1        2 2021-01-01 00:14:17
1        2 2021-01-01 03:57:20
1        2 2021-01-01 22:01:11
1        2 2021-01-01 22:09:55
1        2 2021-01-01 13:15:36
1        2 2021-01-01 12:26:39
2        1 2021-01-02 22:51:17
2        1 2021-01-02 13:44:12
2        1 2021-01-02 01:39:14
3        3 2021-01-02 09:22:16
3        3 2021-01-02 03:34:15
3        3 2021-01-02 23:05:49
3        3 2021-01-02 02:21:35
3        3 2021-01-02 19:51:41
3        3 2021-01-02 16:02:20
3        3 2021-01-02 18:14:05
3        3 2021-01-02 09:07:14
3        3 2021-01-02 22:43:44
3        3 2021-01-02 20:48:15
4        2 2021-01-03 19:25:04
4        2 2021-01-03 14:08:03
4        2 2021-01-03 21:23:58
4        2 2021-01-03 17:24:58
5        4 2021-01-01 23:37:41
5        4 2021-01-01 06:06:17
5        4 2021-01-01 19:23:29
5        4 2021-01-01 02:12:50
5        4 2021-01-01 08:09:59
5        4 2021-01-01 03:49:30
5        4 2021-01-01 08:00:42
5        4 2021-01-01 08:03:34
5        4 2021-01-01 15:36:12
5        4 2021-01-01 14:50:43
5        4 2021-01-01 14:54:04
5        4 2021-01-01 14:58:08

【讨论】:

  • 我想到的确切解决方案 +1。您可以将unit='s' 传递给to_timedelta,而不是与1e9 相乘。
  • 感谢@Quang 更新。我在我的手机上,我不记得指定秒数的确切方法;)
猜你喜欢
  • 2018-11-03
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2022-11-30
  • 2014-05-22
  • 2021-05-17
  • 2017-06-03
相关资源
最近更新 更多