我正在从csv创建一个DataFrame,如下所示:

stock = pd.read_csv('data_in/' + filename + '.csv', skipinitialspace=True)

DataFrame有一个日期列。是否有一种方法可以创建一个新的DataFrame(或者只是覆盖现有的DataFrame),它只包含日期值落在指定日期范围内或两个指定日期值之间的行?


当前回答

你也可以用between:

df[df.some_date.between(start_date, end_date)]

其他回答

import pandas as pd

technologies = ({
    'Courses':["Spark","PySpark","Hadoop","Python","Pandas","Hadoop","Spark"],
    'Fee' :[22000,25000,23000,24000,26000,25000,25000],
    'Duration':['30days','50days','55days','40days','60days','35days','55days'],
    'Discount':[1000,2300,1000,1200,2500,1300,1400],
    'InsertedDates':["2021-11-14","2021-11-15","2021-11-16","2021-11-17","2021-11-18","2021-11-19","2021-11-20"]
               })
df = pd.DataFrame(technologies)
print(df)

使用pandas.DataFrame.loc按日期过滤行

方法1:

    mask = (df['InsertedDates'] > start_date) & (df['InsertedDates'] <= end_date)

    df2 = df.loc[mask]
    print(df2)

方法2:

    start_date = '2021-11-15'
    end_date = '2021-11-19'
    after_start_date = df["InsertedDates"] >= start_date
    before_end_date = df["InsertedDates"] <= end_date
    between_two_dates = after_start_date & before_end_date


    df2 = df.loc[between_two_dates]
    print(df2)

使用pandas.DataFrame.query()选择数据帧行

start_date = '2021-11-15'
end_date   = '2021-11-18'
df2 = df.query('InsertedDates >= @start_date and InsertedDates <= @end_date')
print(df2)

使用datafframe .query()选择两个日期之间的行

start_date = '2021-11-15'
end_date = '2021-11-18'
df2 = df.query('InsertedDates > @start_date and InsertedDates < @end_date')
print(df2)

pandas.Series.between()函数使用两个日期

df2 = df.loc[df["InsertedDates"].between("2021-11-16", "2021-11-18")]
print(df2)

使用DataFrame.isin()在两个日期之间选择数据帧行

df2 = df[df["InsertedDates"].isin(pd.date_range("2021-11-15", "2021-11-17"))]
print(df2)

为了保持解决方案的简单和python性,我建议您尝试一下。

在这种情况下,如果你要经常这样做,最好的解决方案是首先将日期列设置为索引,这将转换DateTimeIndex中的列,并使用以下条件切片任何范围的日期。

import pandas as pd

data_frame = data_frame.set_index('date')

df = data_frame[(data_frame.index > '2017-08-10') & (data_frame.index <= '2017-08-15')]

你也可以用between:

df[df.some_date.between(start_date, end_date)]

你可以用pd.date_range()和Timestamp来做。 假设你已经使用parse_dates选项读取了一个带日期列的csv文件:

df = pd.read_csv('my_file.csv', parse_dates=['my_date_col'])

然后你可以定义一个日期范围索引:

rge = pd.date_range(end='15/6/2020', periods=2)

然后通过地图根据日期过滤你的值:

df.loc[df['my_date_col'].map(lambda row: row.date() in rge)]

你可以使用truncate方法:

dates = pd.date_range('2016-01-01', '2016-01-06', freq='d')
df = pd.DataFrame(index=dates, data={'A': 1})

            A
2016-01-01  1
2016-01-02  1
2016-01-03  1
2016-01-04  1
2016-01-05  1
2016-01-06  1

选择两个日期之间的数据:

df.truncate(before=pd.Timestamp('2016-01-02'),
            after=pd.Timestamp('2016-01-4'))

输出:

            A
2016-01-02  1
2016-01-03  1
2016-01-04  1