我正在从 csv 创建一个 DataFrame,如下所示:
stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)
DataFrame 有一个日期列。有没有办法创建一个新的 DataFrame(或只是覆盖现有的 DataFrame),它只包含日期值在指定日期范围内或两个指定日期值之间的行?
原文由 darkpool 发布,翻译遵循 CC BY-SA 4.0 许可协议
我觉得最好的选择是使用直接检查而不是使用 loc 函数:
df = df[(df['date'] > '2000-6-1') & (df['date'] <= '2000-6-10')]
这个对我有用。
带有切片的 loc 函数的主要问题是限制应该存在于实际值中,否则将导致 KeyError。
原文由 Christin Jose 发布,翻译遵循 CC BY-SA 3.0 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
有两种可能的解决方案:
df.loc[mask]
df[start_date : end_date]
使用布尔掩码:
确保
df['date']
是具有 dtypedatetime64[ns]
的系列:制作一个布尔掩码。
start_date
andend_date
can bedatetime.datetime
s,np.datetime64
s,pd.Timestamp
s, or even datetime strings:选择子数据框:
或重新分配给
df
例如,
产量
使用 DatetimeIndex :
如果您要按日期进行大量选择,首先将
date
列设置为索引可能会更快。然后您可以使用df.loc[start_date:end_date]
按日期选择行。产量
While Python list indexing, eg
seq[start:end]
includesstart
but notend
, in contrast, Pandasdf.loc[start_date : end_date]
includes both end-points in the result如果它们在索引中。start_date
和end_date
都必须在索引中。另请注意,
pd.read_csv
有一个parse_dates
参数,您可以使用该参数将date
列解析为datetime64
因此,如果您使用parse_dates
,则不需要使用df['date'] = pd.to_datetime(df['date'])
。