Python中如何基于指定日期生成±40分钟内的字符串日期列表?
解决日期范围字符串列表生成与DataFrame过滤问题
嘿,我发现你代码里的问题啦,咱们一步步来捋清楚:
问题根源
pd.date_range结果直接转字符串的错误:你把pd.date_range返回的DatetimeIndex直接转成str(),得到的是整个索引的字符串描述(比如类似"DatetimeIndex(['2020-09-08 21:05:00', ...], dtype='datetime64[ns]', freq='T')"),这根本不是单个日期字符串组成的列表,自然没法用来过滤DataFrame。Lower_limit的日期范围方向错误:你写的pd.date_range(start=Data, end=b, periods=41)里,b是Data减40分钟,比Data早,start比end大的话,date_range不会生成正确的递减序列,得把start和end反过来。- 日期格式不匹配:原始的
Data_raw格式是"%d/%m/%y %H:%M",但默认DatetimeIndex转字符串是"%Y-%m-%d %H:%M:%S"格式,和原始字符串格式不一致,过滤自然匹配不上。
正确的实现步骤
咱们来修改代码,生成和原始字符串格式一致的日期列表:
from datetime import datetime, timedelta import pandas as pd # 原始日期字符串 Data_raw = "08/09/20 21:05" # 解析为datetime对象 base_date = datetime.strptime(Data_raw, '%d/%m/%y %H:%M') # 计算上下限时间 upper_limit_time = base_date + timedelta(minutes=40) lower_limit_time = base_date - timedelta(minutes=40) # 生成上限的日期序列(从base_date到upper_limit_time,共41个点,间隔1分钟) upper_dates = pd.date_range(start=base_date, end=upper_limit_time, periods=41) # 生成下限的日期序列(注意start是更早的lower_limit_time,end是base_date) lower_dates = pd.date_range(start=lower_limit_time, end=base_date, periods=41) # 将DatetimeIndex转换为和原始格式一致的字符串列表 # 这里用strftime('%d/%m/%y %H:%M')来匹配原始格式 upper_str_list = [dt.strftime('%d/%m/%y %H:%M') for dt in upper_dates] lower_str_list = [dt.strftime('%d/%m/%y %H:%M') for dt in lower_dates] # 合并两个列表并去重(因为base_date在两个列表里都存在) full_date_list = list(set(lower_str_list + upper_str_list)) # 可选:按时间排序 full_date_list.sort(key=lambda x: datetime.strptime(x, '%d/%m/%y %H:%M'))
验证过滤效果
现在用full_date_list去过滤DataFrame就没问题了,因为里面的字符串格式和Data_raw完全一致,而且是真正的单个日期字符串的列表。
举个例子,假设你的DataFrame有一列叫date_col,过滤代码可以这么写:
filtered_df = df[df['date_col'].isin(full_date_list)]
这样就能得到你想要的±40分钟区间内的所有数据啦~
内容的提问来源于stack exchange,提问作者Shold
相关产品推荐
相关产品推荐

