【问题标题】:Pandas Timedelta attributes (_m, _s): odd behaviourPandas Timedelta 属性(_m,_s):奇怪的行为
【发布时间】:2021-03-12 20:54:56
【问题描述】:

我目睹了一些奇怪的行为访问属性,例如来自 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

【问题讨论】:

    标签: python pandas pycharm timedelta


    【解决方案1】:

    mean_timedeltaTimedelta 类型的对象。通过赋值创建对象时,不会填充对象的属性。你可以通过访问属性_is_populated来查看。

    当您第一次使用print(mean_timedelta) 打印整个对象时,属性会在内部填充。这就是为什么您可以访问_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)
    

    【讨论】:

    • 非常感谢,你的回答很清楚。我仍然想知道如果它未填充,为什么它会返回0:对我来说,这就像返回不是“真实”的东西。我的下一个问题是:我真的可以以某种方式故意填充它吗?最好的方法是什么?因为打印它是可以的,但不是,我应该说,非常专业。
    • 我也不知道为什么它返回0。也许是因为属性是这样初始化的。有必要对代码进行更多调查。要有意填充它,您可以调用mean_timedelta._ensure_components()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多