Python 如何过滤两个日期时间索引?

Python 如何过滤两个日期时间索引?,python,pandas,Python,Pandas,我有两个日期时间索引-一个是工作日的日期范围,另一个是假期列表 我按开始日期和结束日期过滤假期列表。但现在我需要加入他们,并放弃任何重复(假期和交易日都存在) 最后,我需要将daterange转换为一个格式化字符串列表,即:yyyy\u mm\u dd,我可以在以后进行迭代 以下是我目前的代码: import datetime import pandas as pd from pandas.tseries.holiday import AbstractHolidayCalendar, Holid

我有两个日期时间索引-一个是工作日的日期范围,另一个是假期列表

我按开始日期和结束日期过滤假期列表。但现在我需要加入他们,并放弃任何重复(假期和交易日都存在)

最后,我需要将daterange转换为一个格式化字符串列表,即:
yyyy\u mm\u dd
,我可以在以后进行迭代

以下是我目前的代码:

import datetime
import pandas as pd
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \
    USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \
    USLaborDay, USThanksgivingDay

class USTradingCalendar(AbstractHolidayCalendar):
    rules = [
        Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday),
        USMartinLutherKingJr,
        USPresidentsDay,
        GoodFriday,
        USMemorialDay,
        Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday),
        USLaborDay,
        USThanksgivingDay,
        Holiday('Christmas', month=12, day=25, observance=nearest_workday)
    ]

def get_trading_close_holidays(year):
    inst = USTradingCalendar()  
    return inst.holidays(datetime.datetime(year-1, 12, 31), 
                         datetime.datetime(year, 12, 31))

start_date = "2017_07_01"
end_date = "2017_08_31"

start_date = datetime.datetime.strptime(start_date,"%Y_%m_%d").date()
end_date = datetime.datetime.strptime(end_date,"%Y_%m_%d").date()

date_range = pd.bdate_range(start = start_date, end = end_date, name = 
                            "trading_days")  
holidays = get_trading_close_holidays(start_date.year)
holidays = holidays.where((holidays.date > start_date) & 
                          (holidays.date < end_date))
holidays = holidays.dropna(how = 'any')
date_range = date_range.where(~(date_range.trading_days.isin(holidays)))
导入日期时间
作为pd进口熊猫
从pandas.tseries.holiday导入摘要holiday日历、假日、最近的工作日、\
美国马丁·路德金,美国居民星期四,耶稣受难节,美国纪念日\
我们劳动节,我们感恩节
类USTradingCalendar(抽象假日日历):
规则=[
假日('NewYearsDay',月=1,日=1,纪念日=最近的工作日),
小马丁路德金,
星期四,
耶稣受难节,
纪念日,
假日(“美国独立日”,月=7,日=4,纪念日=最近的工作日),
劳动节,
我们感恩节,
假日(“圣诞节”,月=12,日=25,纪念日=最近的工作日)
]
def get_TRANDING_close_假期(年):
inst=USTradingCalendar()
返回仪表假日(日期时间日期时间(第1年、第12年、第31年),
datetime.datetime(年份,12,31))
开始日期=“2017年7月1日”
结束日期=“2017年8月31日”
开始日期=datetime.datetime.strTime(开始日期,“%Y\u%m\u%d”).date()
end_date=datetime.datetime.strTime(end_date,“%Y_%m_%d”).date()
日期范围=pd.B日期范围(开始=开始日期,结束=结束日期,名称=
“交易日”)
假日=获得交易结束假日(开始日期.年)
假日=假日。其中((假日.日期>开始日期)和
(节假日日期<结束日期))
假日=假日.dropna(how='any')
date\u range=date\u range.where(~(date\u range.trading\u days.isin(节假日)))

考虑按布尔条件过滤:

date_range = date_range[date_range.date != holidays.date]
print(date_range)   # ONE HOLIDAY 2017-07-04 DOES NOT APPEAR

# DatetimeIndex(['2017-07-03', '2017-07-05', '2017-07-06', '2017-07-07',
#                '2017-07-10', '2017-07-11', '2017-07-12', '2017-07-13',
#                '2017-07-14', '2017-07-17', '2017-07-18', '2017-07-19',
#                '2017-07-20', '2017-07-21', '2017-07-24', '2017-07-25',
#                '2017-07-26', '2017-07-27', '2017-07-28', '2017-07-31',
#                '2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04',
#                '2017-08-07', '2017-08-08', '2017-08-09', '2017-08-10',
#                '2017-08-11', '2017-08-14', '2017-08-15', '2017-08-16',
#                '2017-08-17', '2017-08-18', '2017-08-21', '2017-08-22',
#                '2017-08-23', '2017-08-24', '2017-08-25', '2017-08-28',
#                '2017-08-29', '2017-08-30', '2017-08-31'],
#               dtype='datetime64[ns]', name='trading_days', freq=None)
使用
astype()
将日期时间索引转换为字符串类型数组,甚至使用
tostring()
进行列表转换:

strdates = date_range.date.astype('str').tolist()
print(strdates)

# ['2017-07-03', '2017-07-05', '2017-07-06', '2017-07-07', '2017-07-10', 
#  '2017-07-11', '2017-07-12', '2017-07-13', '2017-07-14', '2017-07-17', 
#  '2017-07-18', '2017-07-19', '2017-07-20', '2017-07-21', '2017-07-24', 
#  '2017-07-25', '2017-07-26', '2017-07-27', '2017-07-28', '2017-07-31', 
#  '2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04', '2017-08-07', 
#  '2017-08-08', '2017-08-09', '2017-08-10', '2017-08-11', '2017-08-14', 
#  '2017-08-15', '2017-08-16', '2017-08-17', '2017-08-18', '2017-08-21', 
#  '2017-08-22', '2017-08-23', '2017-08-24', '2017-08-25', '2017-08-28', 
#  '2017-08-29', '2017-08-30', '2017-08-31']

考虑按布尔条件过滤:

date_range = date_range[date_range.date != holidays.date]
print(date_range)   # ONE HOLIDAY 2017-07-04 DOES NOT APPEAR

# DatetimeIndex(['2017-07-03', '2017-07-05', '2017-07-06', '2017-07-07',
#                '2017-07-10', '2017-07-11', '2017-07-12', '2017-07-13',
#                '2017-07-14', '2017-07-17', '2017-07-18', '2017-07-19',
#                '2017-07-20', '2017-07-21', '2017-07-24', '2017-07-25',
#                '2017-07-26', '2017-07-27', '2017-07-28', '2017-07-31',
#                '2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04',
#                '2017-08-07', '2017-08-08', '2017-08-09', '2017-08-10',
#                '2017-08-11', '2017-08-14', '2017-08-15', '2017-08-16',
#                '2017-08-17', '2017-08-18', '2017-08-21', '2017-08-22',
#                '2017-08-23', '2017-08-24', '2017-08-25', '2017-08-28',
#                '2017-08-29', '2017-08-30', '2017-08-31'],
#               dtype='datetime64[ns]', name='trading_days', freq=None)
使用
astype()
将日期时间索引转换为字符串类型数组,甚至使用
tostring()
进行列表转换:

strdates = date_range.date.astype('str').tolist()
print(strdates)

# ['2017-07-03', '2017-07-05', '2017-07-06', '2017-07-07', '2017-07-10', 
#  '2017-07-11', '2017-07-12', '2017-07-13', '2017-07-14', '2017-07-17', 
#  '2017-07-18', '2017-07-19', '2017-07-20', '2017-07-21', '2017-07-24', 
#  '2017-07-25', '2017-07-26', '2017-07-27', '2017-07-28', '2017-07-31', 
#  '2017-08-01', '2017-08-02', '2017-08-03', '2017-08-04', '2017-08-07', 
#  '2017-08-08', '2017-08-09', '2017-08-10', '2017-08-11', '2017-08-14', 
#  '2017-08-15', '2017-08-16', '2017-08-17', '2017-08-18', '2017-08-21', 
#  '2017-08-22', '2017-08-23', '2017-08-24', '2017-08-25', '2017-08-28', 
#  '2017-08-29', '2017-08-30', '2017-08-31']

虽然标题提出了问题,但帖子并没有指出问题所在,更不用说提出具体问题了。你只描述需求。有错误吗?意外的结果?请显示所需的输出。抱歉-我这里的最后一行代码不起作用。我的问题有两个方面:1)寻找一种最佳实践方法,将两个datetime索引组合在一起,以便删除任何重复项;2)如何将这些datetime对象设置为字符串格式。尽管标题提出了问题,但帖子并没有确定问题,更不用说提出具体问题了。你只描述需求。有错误吗?意外的结果?请显示所需的输出。抱歉-我这里的最后一行代码不起作用。我的问题有两个方面:1)寻找一种最佳实践方法,将两个日期时间索引组合在一起,以便删除任何重复项&2)然后如何将这些日期时间对象作为字符串进行格式化这正是我所要寻找的-感谢您的帮助很高兴听到!很高兴能帮上忙。这正是我要找的——谢谢你的帮助很高兴听到!很乐意帮忙。