计算 timedelta 元素的标准偏差列

Calculates a standard deviation columns for timedelta elements

我在 Python 中有以下数据框:

ID country_ID visit_time
0 ESP 10 days 12:03:00
0 ESP 5 days 02:03:00
0 ENG 5 days 10:02:00
1 ENG 3 days 08:05:03
1 ESP 1 days 03:02:00
1 ENG 2 days 07:01:03
2 ENG 0 days 12:01:02

对于每个 ID,我想计算每个 country_ID 组的标准差。

std_visit_ESP 和 std_visit_ENG 列。

ID std_visit_ESP std_visit_ENG
0 2 days 17:00:00 0 days 00:00:00
1 0 days 00:00:00 0 days 12:32:00
2 NaT 0 days 00:00:00

对于mean的groupby方法,可以指定参数numeric_only = False,但是groupby的std方法没有这个选项

我的想法是将timedelta转换为秒,计算标准差,然后将其转换回timedelta。这是一个例子:

    td1 = timedelta(10,0,0,0,3,12,0).total_seconds()
    td2 = timedelta(5,0,0,0,3,2,0).total_seconds()
    arr = [td1,td2]
    var = np.std(arr)
    show_s = pd.to_timedelta(var, unit='s')
    print(show_s)

我不知道如何将它与 groupby 一起使用以获得所需的结果。感谢您的帮助。

如果我理解正确,这应该对你有用:

stddevs = df['visit_time'].dt.total_seconds().groupby([df['country_ID']]).std().apply(lambda x: pd.Timedelta(seconds=x))

输出:

>>> stddevs
country_ID
ENG   2 days 01:17:43.835702
ESP   4 days 16:40:16.598773
Name: visit_time, dtype: timedelta64[ns]

格式:

stddevs = df['visit_time'].dt.total_seconds().groupby([df['country_ID']]).std().apply(lambda x: pd.Timedelta(seconds=x)).to_frame().T.add_prefix('std_visit_').reset_index(drop=True).rename_axis(None, axis=1)

输出:

>>> stddevs
           std_visit_ENG          std_visit_ESP
0 2 days 01:17:43.835702 4 days 16:40:16.598773

使用GroupBy.std and pd.to_timedelta

total_seconds = \
    pd.to_timedelta(
        df['visit_time'].dt.total_seconds()
                        .groupby([df['ID'], df['country_ID']]).std(),
        unit='S').unstack().fillna(pd.Timedelta(days=0))
print(total_seconds)
country_ID                       ENG                       ESP
ID                                                            
0                    0 days 00:00:00 3 days 19:55:25.973595304
1          0 days 17:43:29.315934274           0 days 00:00:00
2                    0 days 00:00:00           0 days 00:00:00