【发布时间】: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是罪魁祸首。这将返回timedelta而start和end属于datetime类型。修正这种不一致。