Python 将pandas数据帧中的时间戳列表替换为每行中每个时间戳的时间戳列表

Python 将pandas数据帧中的时间戳列表替换为每行中每个时间戳的时间戳列表,python,pandas,timestamp,time-series,Python,Pandas,Timestamp,Time Series,我在pandas数据框中有一列,它由包含时间戳的列表组成。我想用每行每个时间戳的小时列表替换这个时间戳列表。下面是一个例子 df = pd.DataFrame( {'id':[1,2], 'time':[ [2017-09-05 03:34:51,2016-03-07 05:24:55], [2016-02-06 03:14:21,2014-08-09 09:12:44, 2011-05-02 07:43:21] ] }) 我想要一个名为“小时”的新专栏 df['hour'] = [ [3,

我在pandas数据框中有一列,它由包含时间戳的列表组成。我想用每行每个时间戳的小时列表替换这个时间戳列表。下面是一个例子

df = pd.DataFrame( {'id':[1,2], 'time':[ [2017-09-05 03:34:51,2016-03-07 05:24:55], [2016-02-06 03:14:21,2014-08-09 09:12:44, 2011-05-02 07:43:21] ] }) 
我想要一个名为“小时”的新专栏

df['hour'] = [ [3,5], [3,9,7] ]

我使用map()和apply()尝试了不同的功能,但都没有达到预期的效果,非常感谢您的帮助。

使用
apply
+
到\u datetime

s = df.time.apply(lambda x: pd.to_datetime(x, errors='coerce').hour.tolist() )
s

0       [3, 5]
1    [3, 9, 7]
Name: time, dtype: object

df['hour'] = s
df

   id                                               time       hour
0   1         [2017-09-05 03:34:51, 2016-03-07 05:24:55]     [3, 5]
1   2  [2016-02-06 03:14:21, 2014-08-09 09:12:44, 201...  [3, 9, 7]
法定警告,这通常是低效的,因为您有一列列表


如果您想知道我将如何存储这些数据,应该是这样的:

df

   id                 time
0   1  2017-09-05 03:34:51
1   1  2016-03-07 05:24:55
2   2  2016-02-06 03:14:21
3   2  2014-08-09 09:12:44
4   2  2011-05-02 07:43:21
现在,获取小时数非常简单:

h = pd.to_datetime(df.time).dt.hour
h

0    3
1    5
2    3
3    9
4    7
Name: time, dtype: int64

df['hour'] = h

如果您想执行分组计算,您可以始终使用
df.groupby

非常感谢@COLDSPEED它工作得非常好。你是说一列列表效率很低,那么,为每个用户保存这么多信息的最佳方式是什么?假设我收集不同用户访问一个网站的时间,其中一些用户有1000次访问,其他人只有5次访问,例如,如果我将每个访问时间戳保存在一个新列中,我将有1000次列,仅用于timestmps,而对于一些用户,这些列将是空的,我认为这是非常低效的。取决于此用户访问站点的mqny次数。如果你有更好的主意,请告诉我。再次感谢这就是为什么我选择将每个用户的所有时间戳保存在一个列表中,而不是长度为5或5的列表中1000@MartinHeusen看我的编辑,它真的很简单。还有一条经验法则——如何将这些数据存储在SQL表中?当然你不能在那里存储列表和元组。@MartinHeusen最后一件事。如果这个答案有帮助,再次感谢。有趣的是,我的原始数据是您提到的格式(双索引),但是我使用groupby()将每个用户的所有数据都放在一行中,因为我正在执行ML聚类,当数据按用户分组时,会产生最佳结果。不管怎么说,这帮了大忙。我也按了“接受”按钮:)