Pandas dataframe Timedelta 格式:天数或累计小时数
Pandas dataframe Timedelta format: with days or with cumulative hours
我试图了解 pandas 根据什么显示 Timedelta 值 'days' 或累计小时数。
在下面的例子中,我取一个 Timedelta 列并计算它的累计和:
In [1]: import pandas as pd
In [2]: pd.__version__
Out[2]: '1.0.3'
In [3]: df = pd.DataFrame(
...: [
...: "01:07:37",
...: "13:16:44",
...: "11:09:56",
...: "12:05:00",
...: "01:33:01",
...: ],
...: columns=["Duration"],
...: )
In [4]: df.loc[:, 'Duration'] = pd.to_timedelta(df['Duration'])
...: df.loc[:, 'Cumulative'] = df['Duration'].cumsum()
...:
...: df
Out[4]:
Duration Cumulative
0 01:07:37 0 days 01:07:37
1 13:16:44 0 days 14:24:21
2 11:09:56 1 days 01:34:17
3 12:05:00 1 days 13:39:17
4 01:33:01 1 days 15:12:18
在生成的数据框中,新列 (Cumulative
) 显示 'days',而原始列 (Duration
) 显示累计小时数。
两列的数据类型相同。
In [5]: df.dtypes
Out[5]:
Duration timedelta64[ns]
Cumulative timedelta64[ns]
dtype: object
此外,当我查看第一行时,它显示 'number of hours' 格式,但是,当我查看各个值时,它 returns 它们在 Timedelta('N days HH:MM:SS')格式。
In [6]: df.iloc[0, :]
Out[6]:
Duration 01:07:37
Cumulative 01:07:37
Name: 0, dtype: timedelta64[ns]
In [7]: df['Duration'][0], df['Cumulative'][0]
Out[7]: (Timedelta('0 days 01:07:37'), Timedelta('0 days 01:07:37'))
所以我的问题是为什么会发生这种变化,我该如何控制它?
编辑
正如@Moosa Saadat 和@Quang Hoang 指出的那样,当 任何 Timedelta 值超过 24 小时阈值时,就会发生不同格式之间的转换。
由于我没有找到执行转换的内置方法,这里有一个小的辅助函数,可以以累计小时格式打印 Timedelta 值。
In [4]: def days_to_cumhours(timedelta):
...: hours = timedelta.components[0] * 24 + timedelta.components[1]
...:
...: return f"{hours:0>2}:{timedelta.components[2]:0>2}:{timedelta.components[3]:0>2}"
In [5]: df['Cumulative'].apply(days_to_cumhours)
Out[5]:
0 01:07:37
1 14:24:21
2 25:34:17
3 37:39:17
4 39:12:18
Name: Cumulative, dtype: object
为什么会发生这种变化?
时间字符串列表的所有值都小于 24 小时。这意味着他们都有 day = 0
。因此,当您打印 df 时,pandas
不会显示它。如果你改变一些值,比方说 12:05:00
到 25:05:00
,你将得到以下输出
Duration Cumulative
0 0 days 01:07:37 0 days 01:07:37
1 0 days 13:16:44 0 days 14:24:21
2 0 days 11:09:56 1 days 01:34:17
3 1 days 01:05:00 2 days 02:39:17
4 0 days 01:33:01 2 days 04:12:18
现在,由于我们的 Duration
列中有不同的 days
,pandas 显示它的值。
如何控制它?
您不必担心输出的差异。当您需要获取值时,您可以使用 components()
函数,其中 returns 一个 namedtuple
print(df['Duration'].iloc[0].components)
输出:
Components(days=0, hours=1, minutes=7, seconds=37, milliseconds=0, microseconds=0, nanoseconds=0)
我试图了解 pandas 根据什么显示 Timedelta 值 'days' 或累计小时数。
在下面的例子中,我取一个 Timedelta 列并计算它的累计和:
In [1]: import pandas as pd
In [2]: pd.__version__
Out[2]: '1.0.3'
In [3]: df = pd.DataFrame(
...: [
...: "01:07:37",
...: "13:16:44",
...: "11:09:56",
...: "12:05:00",
...: "01:33:01",
...: ],
...: columns=["Duration"],
...: )
In [4]: df.loc[:, 'Duration'] = pd.to_timedelta(df['Duration'])
...: df.loc[:, 'Cumulative'] = df['Duration'].cumsum()
...:
...: df
Out[4]:
Duration Cumulative
0 01:07:37 0 days 01:07:37
1 13:16:44 0 days 14:24:21
2 11:09:56 1 days 01:34:17
3 12:05:00 1 days 13:39:17
4 01:33:01 1 days 15:12:18
在生成的数据框中,新列 (Cumulative
) 显示 'days',而原始列 (Duration
) 显示累计小时数。
两列的数据类型相同。
In [5]: df.dtypes
Out[5]:
Duration timedelta64[ns]
Cumulative timedelta64[ns]
dtype: object
此外,当我查看第一行时,它显示 'number of hours' 格式,但是,当我查看各个值时,它 returns 它们在 Timedelta('N days HH:MM:SS')格式。
In [6]: df.iloc[0, :]
Out[6]:
Duration 01:07:37
Cumulative 01:07:37
Name: 0, dtype: timedelta64[ns]
In [7]: df['Duration'][0], df['Cumulative'][0]
Out[7]: (Timedelta('0 days 01:07:37'), Timedelta('0 days 01:07:37'))
所以我的问题是为什么会发生这种变化,我该如何控制它?
编辑
正如@Moosa Saadat 和@Quang Hoang 指出的那样,当 任何 Timedelta 值超过 24 小时阈值时,就会发生不同格式之间的转换。
由于我没有找到执行转换的内置方法,这里有一个小的辅助函数,可以以累计小时格式打印 Timedelta 值。
In [4]: def days_to_cumhours(timedelta):
...: hours = timedelta.components[0] * 24 + timedelta.components[1]
...:
...: return f"{hours:0>2}:{timedelta.components[2]:0>2}:{timedelta.components[3]:0>2}"
In [5]: df['Cumulative'].apply(days_to_cumhours)
Out[5]:
0 01:07:37
1 14:24:21
2 25:34:17
3 37:39:17
4 39:12:18
Name: Cumulative, dtype: object
为什么会发生这种变化?
时间字符串列表的所有值都小于 24 小时。这意味着他们都有 day = 0
。因此,当您打印 df 时,pandas
不会显示它。如果你改变一些值,比方说 12:05:00
到 25:05:00
,你将得到以下输出
Duration Cumulative
0 0 days 01:07:37 0 days 01:07:37
1 0 days 13:16:44 0 days 14:24:21
2 0 days 11:09:56 1 days 01:34:17
3 1 days 01:05:00 2 days 02:39:17
4 0 days 01:33:01 2 days 04:12:18
现在,由于我们的 Duration
列中有不同的 days
,pandas 显示它的值。
如何控制它?
您不必担心输出的差异。当您需要获取值时,您可以使用 components()
函数,其中 returns 一个 namedtuple
print(df['Duration'].iloc[0].components)
输出:
Components(days=0, hours=1, minutes=7, seconds=37, milliseconds=0, microseconds=0, nanoseconds=0)