Pandas Timedelta 属性 (_m, _s):奇怪的行为
Pandas Timedelta attributes (_m, _s): odd behaviour
我目睹了一些奇怪的行为从 pandas timedelta 对象访问属性 例如 _m
或 _s
。
让我用一个最小的例子来解释这个问题,我在 PyCharm(PyCharm 2020.2.3(社区版))
中从控制台 运行
>>> import pandas as pd
>>> # Creating a dataFrame with 2 pandas timedeltas:
... df_test=pd.DataFrame({"Timedeltas":[pd.Timedelta('1 days 1:01:01'), pd.Timedelta('2 days 2:02:02')]})
Timedelta('0 days 00:02:56.230217907')
>>> mean_timedelta=df_test['Timedeltas'].mean()
... print(mean_timedelta._m)
0
>>> mean_timedelta=df_test['Timedeltas'].mean()
... print(mean_timedelta)
... print(mean_timedelta._m)
1 days 13:31:31.500000
31
为什么我第一次执行print(mean_timedelta._m)
时没有打印31?为什么我得到的是 0
?
为什么我之前运行print(mean_timedelta)
才打印31?
mean_timedelta
是类型 Timedelta
的 object。当通过赋值创建 object 时,不会填充 object 的属性。您可以通过访问属性 _is_populated
.
来检查它
当您第一次使用 print(mean_timedelta)
打印整个 object 时,属性会在内部填充。这就是为什么您可以访问 _m
:
等属性的原因
mean_timedelta=df_test['Timedeltas'].mean()
print(mean_timedelta.is_populated)
print(mean_timedelta)
print(mean_timedelta.is_populated)
print(mean_timedelta._m)
print(mean_timedelta.is_populated)
输出:
False
1 days 13:31:31.500000
True
31
True
我的回答是基于 source code of the class.
要有意填充它,您可以调用:
mean_timedelta._ensure_components()
如果您需要以其他方式获取会议记录,您可以这样做:
print((mean_timedelta.seconds//60)%60)
我目睹了一些奇怪的行为从 pandas timedelta 对象访问属性 例如 _m
或 _s
。
让我用一个最小的例子来解释这个问题,我在 PyCharm(PyCharm 2020.2.3(社区版))
>>> import pandas as pd
>>> # Creating a dataFrame with 2 pandas timedeltas:
... df_test=pd.DataFrame({"Timedeltas":[pd.Timedelta('1 days 1:01:01'), pd.Timedelta('2 days 2:02:02')]})
Timedelta('0 days 00:02:56.230217907')
>>> mean_timedelta=df_test['Timedeltas'].mean()
... print(mean_timedelta._m)
0
>>> mean_timedelta=df_test['Timedeltas'].mean()
... print(mean_timedelta)
... print(mean_timedelta._m)
1 days 13:31:31.500000
31
为什么我第一次执行
print(mean_timedelta._m)
时没有打印31?为什么我得到的是0
?为什么我之前运行
print(mean_timedelta)
才打印31?
mean_timedelta
是类型 Timedelta
的 object。当通过赋值创建 object 时,不会填充 object 的属性。您可以通过访问属性 _is_populated
.
当您第一次使用 print(mean_timedelta)
打印整个 object 时,属性会在内部填充。这就是为什么您可以访问 _m
:
mean_timedelta=df_test['Timedeltas'].mean()
print(mean_timedelta.is_populated)
print(mean_timedelta)
print(mean_timedelta.is_populated)
print(mean_timedelta._m)
print(mean_timedelta.is_populated)
输出:
False
1 days 13:31:31.500000
True
31
True
我的回答是基于 source code of the class.
要有意填充它,您可以调用:
mean_timedelta._ensure_components()
如果您需要以其他方式获取会议记录,您可以这样做:
print((mean_timedelta.seconds//60)%60)