早上好。
我的问题如下:我有一个熊猫数据框,其中有一个名为“ fecha”的列,用于存储日期对象,还有一个元组列表,用于存储初始日期时间和最终日期时间。在下面显示示例:
df =
fecha
0 2018-10-01
1 2019-01-12
2 2018-12-25
list_ranges = [(datetime.datetime(2018, 10, 1, 0, 0),
datetime.datetime(2018, 10, 15, 0, 0)),
(datetime.datetime(2018, 10, 16, 0, 0),
datetime.datetime(2018, 10, 31, 0, 0)),
(datetime.datetime(2018, 11, 1, 0, 0), datetime.datetime(2018, 11, 15, 0, 0)),
(datetime.datetime(2018, 11, 16, 0, 0),
datetime.datetime(2018, 11, 30, 0, 0)),
(datetime.datetime(2018, 12, 1, 0, 0), datetime.datetime(2018, 12, 15, 0, 0)),
(datetime.datetime(2018, 12, 16, 0, 0),
datetime.datetime(2018, 12, 31, 0, 0)),
(datetime.datetime(2019, 1, 1, 0, 0), datetime.datetime(2019, 1, 15, 0, 0))]
,我想获取每个日期在列表中的范围的位置。我正在寻找的结果是:
df =
result
0 1
1 7
2 6
目前,我正在这样做:
df.fecha = df.fecha.apply(lambda x: select_quincena(x, quincenas))
def select_quincena(fecha, quincenas):
fecha = datetime.datetime.combine(fecha, datetime.datetime.min.time())
num = 0
for e in quincenas:
num += 1
if fecha >= e[0] and fecha <= e[1]:
return num
它工作正常,但是我很确定有更好,更轻松的方法来实现此目的。
非常感谢您。
答案 0 :(得分:0)
pd.to_datetime
,不使用datetime
模块首先将您的系列转换为熊猫datetime
:
df['fecha'] = pd.to_datetime(df['fecha'])
pd.cut
对类别进行分类这是装箱问题。您可以将pd.cut
用于矢量解决方案:
import numpy as np
from operator import itemgetter
dates = pd.to_datetime([list_ranges[0][0], *map(itemgetter(1), list_ranges)]).values
labels = np.arange(1, len(dates))
df['result'] = pd.cut(df['fecha'].values, bins=dates, labels=labels, include_lowest=True)
print(df)
fecha result
0 2018-10-01 1
1 2019-01-12 7
2 2018-12-25 6
相关:Filtering and creating a column based on the date column
np.searchsorted
用于整数标签在这种情况下,也可以进行二进制搜索来查找所需的插入点。这在np.searchsorted
中得到了有效的实现。
df['result'] = np.searchsorted(dates, df['fecha'].values, side='right')
Cannot cast array data
错误以上经测试可在Pandas 0.23.4 / NumPy 1.15.1上运行。对于其他版本,类型比较可能不一致。在这种情况下,您可以将datetime
的每次提取替换为.values
,从而将.values.astype('datetime64[D]').astype(int)
数组转换为整数。
相关:Cannot cast array data from dtype('M8-ns') to dtype('float64') according to the rule 'safe'。