【问题标题】:pandas select rows on date熊猫在日期选择行
【发布时间】:2021-10-24 09:57:32
【问题描述】:

我在 pandas 和 python 的时间格式上遇到了很大的问题。似乎在某种程度上存在一些我无法解决的不兼容问题......

我正在尝试从与给定日期重叠的熊猫数据框中选择行。

让我们初始化一个随机数据框:

import random
import pandas as pd
import numpy as np
from datetime import timedelta

def random_dates(start, end, n, unit='D', seed=None):
    if not seed:  # from piR's answer
        np.random.seed(0)

    ndays = (end - start).days + 1
    return pd.to_timedelta(np.random.rand(n) * ndays, unit=unit) + start

np.random.seed(0)
start = pd.to_datetime('2015-01-01')
end = pd.to_datetime('2018-01-01')
rd=random_dates(start, end, 1000)
end_date = (rd+timedelta(days=4))
a_pd=pd.DataFrame({"idx":np.random.choice(50, 1000), "start":rd, "end":end_date})

现在我使用与“rd”相同的函数创建单个间隔日期。

start = pd.to_datetime('2016-01-01')
end = pd.to_datetime('2016-01-02')
rd_target=random_dates(start, end, 1)

要查看我的列表日期与目标日期“rd_target”的重叠,我只是 将我的数据框的“结束”与我的 rd_target 的“开始”进行比较,然后 我的数据框的“开始”与 rd_target 的“结束”。

a_pd[a_pd["end"] > rd_target[0]  & a_pd["start"]<rd_target[1] ]

但是python不喜欢它。这里的错误信息:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-63-dab78e1a862e> in <module>
----> 1 a_pd[a_pd["end"] > rd[0]  & a_pd["start"]<rd[1] ]

~/venv/lib/python3.8/site-packages/pandas/core/ops/common.py in new_method(self, other)
     63         other = item_from_zerodim(other)
     64 
---> 65         return method(self, other)
     66 
     67     return new_method

~/venv/lib/python3.8/site-packages/pandas/core/ops/__init__.py in wrapper(self, other)
    392         rvalues = extract_array(other, extract_numpy=True)
    393 
--> 394         res_values = logical_op(lvalues, rvalues, op)
    395         return self._construct_result(res_values, name=res_name)
    396 

~/venv/lib/python3.8/site-packages/pandas/core/ops/array_ops.py in logical_op(left, right, op)
    339     if should_extension_dispatch(lvalues, rvalues):
    340         # Call the method on lvalues
--> 341         res_values = op(lvalues, rvalues)
    342 
    343     else:

~/venv/lib/python3.8/site-packages/pandas/core/ops/roperator.py in rand_(left, right)
     50 
     51 def rand_(left, right):
---> 52     return operator.and_(right, left)
     53 
     54 

TypeError: unsupported operand type(s) for &: 'Timestamp' and 'DatetimeArray'

有什么帮助吗?

【问题讨论】:

  • 看起来函数 random_dates 是罪魁祸首。这将返回 timedeltastartend 属于 datetime 类型。修正这种不一致。

标签: python pandas timestamp


【解决方案1】:

如果您想在 rd_target 时间范围内有 2 个元素,则需要将初始化它的行更改为:

rd_target=random_dates(start, end, 2)

按照写法,rd_target 只有一个元素,你将无法访问索引 1。

此外,您需要在数据框过滤器表达式上加上括号,如下所示:

a_pd[(a_pd["end"] > rd_target[0]) & (a_pd["start"] < rd_target[1])]

有关运算符优先级的更多信息,请访问官方docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2019-12-15
    • 2016-05-08
    • 2016-12-08
    • 2018-12-01
    • 2021-12-14
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多