在 Pandas 中按天过滤获取下一个可用日期
Get next available date in Pandas filter by day
我使用以下代码行过滤了 pandas 数据框中的 datetime64[ns]
类型,以获取每个月特定日期的数据。
df[df['Date'].map(lambda x: x.day) == 1]
输出结果如下:
19.9 2013-07-01
34.8 2013-08-01
12.9 2013-10-01
12.6 2013-11-01
但是如果您注意到 2013-09-01
的条目丢失了,因为它在原始数据集中不可用。在这种情况下,我想获取 2013-09-02
的数据。理想情况下,如果日期在周末(周六和周日或任何缺失日期,如假期或特定日期不可用的数据),我想获取下一个可用日期的数据。想知道我们是否可以使用 pandas 实现,或者我需要手动迭代执行此功能。
我认为您需要 DatetimeIndex
以及 asfreq
和 method='bfill'
来填充缺失值:
df = df.set_index('Date').asfreq('d', method='bfill')
然后按DatetimeIndex.day
过滤:
df1 = df[df.index.day == 1]
示例:
print (df)
Val Date
0 19.9 2013-07-01
1 34.8 2013-08-01
2 10.4 2013-09-02
3 12.9 2013-10-01
4 12.6 2013-11-01
print (df.dtypes)
Val float64
Date datetime64[ns]
df = df.set_index('Date').asfreq('d', method='bfill')
df1 = df[df.index.day == 1]
print (df1)
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-09-01 10.4
2013-10-01 12.9
2013-11-01 12.6
您也可以通过将日期设置为索引并使用 index.get_loc() 搜索下一个现有日期到每个月的第一天并将方法设置为 bfill:
print(df)
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-08-02 34.8
2013-09-02 10.4
2013-10-01 12.9
2013-11-01 12.6
df = df.set_index('Date')
df.iloc[[df.index.get_loc(datetime.datetime(date[0],date[1],1),
method='bfill') for date,_ in df.groupby(
[df.index.year,df.index.month])]]
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-09-02 10.4
2013-10-01 12.9
2013-11-01 12.6
我使用以下代码行过滤了 pandas 数据框中的 datetime64[ns]
类型,以获取每个月特定日期的数据。
df[df['Date'].map(lambda x: x.day) == 1]
输出结果如下:
19.9 2013-07-01
34.8 2013-08-01
12.9 2013-10-01
12.6 2013-11-01
但是如果您注意到 2013-09-01
的条目丢失了,因为它在原始数据集中不可用。在这种情况下,我想获取 2013-09-02
的数据。理想情况下,如果日期在周末(周六和周日或任何缺失日期,如假期或特定日期不可用的数据),我想获取下一个可用日期的数据。想知道我们是否可以使用 pandas 实现,或者我需要手动迭代执行此功能。
我认为您需要 DatetimeIndex
以及 asfreq
和 method='bfill'
来填充缺失值:
df = df.set_index('Date').asfreq('d', method='bfill')
然后按DatetimeIndex.day
过滤:
df1 = df[df.index.day == 1]
示例:
print (df)
Val Date
0 19.9 2013-07-01
1 34.8 2013-08-01
2 10.4 2013-09-02
3 12.9 2013-10-01
4 12.6 2013-11-01
print (df.dtypes)
Val float64
Date datetime64[ns]
df = df.set_index('Date').asfreq('d', method='bfill')
df1 = df[df.index.day == 1]
print (df1)
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-09-01 10.4
2013-10-01 12.9
2013-11-01 12.6
您也可以通过将日期设置为索引并使用 index.get_loc() 搜索下一个现有日期到每个月的第一天并将方法设置为 bfill:
print(df)
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-08-02 34.8
2013-09-02 10.4
2013-10-01 12.9
2013-11-01 12.6
df = df.set_index('Date')
df.iloc[[df.index.get_loc(datetime.datetime(date[0],date[1],1),
method='bfill') for date,_ in df.groupby(
[df.index.year,df.index.month])]]
Val
Date
2013-07-01 19.9
2013-08-01 34.8
2013-09-02 10.4
2013-10-01 12.9
2013-11-01 12.6