我试图从一个表中获取与第二个表中的ID和日期相匹配的价格(对于效果报告工具)。
我使用的是一个非常简单的子集
其中dateLoop[0]
为datetime.datetime(2013,1,10,0,0)
olddate = np.datetime64(dateLoop[0])
pv = dfp[dfp['instrument'].isin(dayfp.instrument.unique()) \
& dfp.date == olddate ]
它引发了异常
TypeError: cannot astype a datetimelike from [datetime64[ns]] to [bool]
如何才能使它与匹配在pandas中创建的日期范围以及将其作为字典导入以使日期时间未被编入索引?
dfp = pd.DataFrame([
dict(instrument = 'GE', price = 10, date = datetime.datetime(2013,1,10,0,0)),
dict(instrument = 'INTC', price = 15, date = datetime.datetime(2013,1,10,0,0))
...]
和
dayfp =
`date id instrument portfolio position price sector \
22 2013-01-11 153 PM usequity 62000 82.82 Consumer Staples
23 2013-01-11 154 CMS usequity 217000 23.14 Utilities
24 2013-01-11 155 EXC usequity 181000 27.16 Utilities
25 2013-01-11 156 AES usequity 467000 10.81 Utilities
26 2013-01-11 157 DOV usequity 92000 53.95 Industrials
mv wt px0
22 5134840 0.063798 NaN
23 5021380 0.062389 NaN
24 4915960 0.061079 NaN
25 5048270 0.062723 NaN
26 4963400 0.061668 NaN
我试图通过从大量历史价格中搜索工具和日期来填充px0。
由于
答案 0 :(得分:1)
如果我理解正确,您只需要将两列中的任何一列转换为另一列的数据类型,以便您可以比较它们。如果是这样,在其中一个列上使用这些类型转换将其转换为匹配类型将解决您的问题。
>>> dt
datetime.datetime(2013, 1, 10, 0, 0)
>>> str(dt)
'2013-01-10 00:00:00'
>>> np.datetime64(str(dt))
numpy.datetime64('2013-01-10T00:00:00-0600')
>>> pd.to_datetime(str(dt))
Timestamp('2013-01-10 00:00:00', tz=None)
>>> np.datetime64(str(dt)).tolist()
datetime.datetime(2013, 1, 10, 6, 0)
这会为您提供所需的转换吗?我无法确定您要尝试做什么,但这些转换应该适用于datetime.datetime到numpy.datetime64和pd.Timestamp。
如果您可以添加更精确的示例数据和示例输出,我可以定制它以使其更有用....
答案 1 :(得分:1)
Python解释
[dfp['instrument'].isin(['GE', 'INTC']) & dfp.date == olddate]
as
[(dfp['instrument'].isin(['GE', 'INTC']) & dfp.date)
== olddate]
而不是
(dfp['instrument'].isin(['GE', 'INTC'])) & (dfp.date == olddate)
根据operator precedence rules &
的优先级高于==
,因此&
旁边的两个术语会在应用==
之前绑定在一起。
如果您不想深入思考运算符优先级问题,请始终将布尔表达式包装在括号中以强制执行所需的操作顺序。
import datetime as DT
import numpy as np
import pandas as pd
dfp = pd.DataFrame([
dict(instrument = 'GE', price = 10, date = DT.datetime(2013,1,10,0,0)),
dict(instrument = 'INTC', price = 15, date = DT.datetime(2013,1,10,0,0))])
olddate = np.datetime64(DT.datetime(2013,1,10,0,0))
pv = dfp[(dfp['instrument'].isin(['GE', 'INTC'])) & (dfp.date == olddate)]
print(pv)
产量
date instrument price
0 2013-01-10 GE 10
1 2013-01-10 INTC 15