簡體   English   中英

select 按日期記錄,其中日期是該月上一個工作日的 15 日

[英]select records by date, where date is 15th ot the previous business day of the month

我正在嘗試 select 對應於每月 15 日的記錄,這是數據的示例:

           date              open               date1          date2
0       2000-01-03 00:00:00  0               2000-01-17 00:00:00    2000-02-15 00:00:00
1       2000-01-07 00:00:00  6084704         2000-01-17 00:00:00    2000-02-15 00:00:00
3       2000-01-12 00:00:00  992482          2000-01-17 00:00:00    2000-02-15 00:00:00
4       2000-01-17 00:00:00  11721104        2000-02-15 00:00:00    2000-03-15 00:00:00
5       2000-01-18 00:00:00  4459200         2000-02-15 00:00:00    2000-03-15 00:00:00
6       2000-01-19 00:00:00 3652363          2000-02-15 00:00:00    2000-03-15 00:00:00
7       2000-01-27 00:00:00 17421705         2000-02-15 00:00:00    2000-03-15 00:00:00
...
43      2000-03-24 00:00:00 13594539         2000-04-17 00:00:00    2000-05-15 00:00:00
44      2000-03-27 00:00:00 5122526          2000-04-17 00:00:00    2000-05-15 00:00:00
45      2000-03-29 00:00:00 3041827          2000-04-17 00:00:00    2000-05-15 00:00:00
46      2000-03-30 00:00:00 4769960          2000-04-17 00:00:00    2000-05-15 00:00:00
48      2000-03-31 00:00:00 15982410         2000-04-17 00:00:00    2000-05-15 00:00:00
49      2000-04-04 00:00:00 3178232          2000-04-17 00:00:00    2000-05-15 00:00:00
51      2000-04-05 00:00:00 15571975         2000-04-17 00:00:00    2000-05-15 00:00:00
52      2000-04-06 00:00:00 2694165          2000-04-17 00:00:00    2000-05-15 00:00:00
53      2000-04-07 00:00:00 536426           2000-04-17 00:00:00    2000-05-15 00:00:00
55      2000-04-10 00:00:00 5523700          2000-04-17 00:00:00    2000-05-15 00:00:00
56      2000-04-11 00:00:00 11212425         2000-04-17 00:00:00    2000-05-15 00:00:00
58      2000-04-12 00:00:00 546223           2000-04-17 00:00:00    2000-05-15 00:00:00
61      2000-04-13 00:00:00 17913960         2000-05-15 00:00:00    2000-06-15 00:00:00
63      2000-04-17 00:00:00 3824185          2000-05-15 00:00:00    2000-06-15 00:00:00
...
1578    2006-01-03 00:00:00 4453005          2006-01-16 00:00:00    2006-02-15 00:00:00
1579    2006-01-04 00:00:00 6557373          2006-01-16 00:00:00    2006-02-15 00:00:00
1580    2006-01-05 00:00:00 2837987          2006-01-16 00:00:00    2006-02-15 00:00:00
...
1634    2006-03-14 00:00:00 31819879         2006-04-17 00:00:00    2006-05-15 00:00:00
1635    2006-03-20 00:00:00 1541321          2006-04-17 00:00:00    2006-05-15 00:00:00
1636    2006-03-21 00:00:00 47047150         2006-04-17 00:00:00    2006-05-15 00:00:00
1638    2006-03-22 00:00:00 6111712          2006-04-17 00:00:00    2006-05-15 00:00:00


有時沒有第 15 天,因為我有一系列工作日。 對於這種情況,我想選擇接近一個月 15 日的記錄。 因此,預期的結果將是:

3       2000-01-12 00:00:00  992482          2000-01-17 00:00:00    2000-02-15 00:00:00
...
61      2000-04-13 00:00:00 17913960         2000-05-15 00:00:00    2000-06-15 00:00:00
...
1634    2006-03-14 00:00:00 31819879         2006-04-17 00:00:00    2006-05-15 00:00:00

我想出了如何找到每個月的 15 號,這不是很困難:

mid_date_mask = df['date'].map(lambda x: x.day) == 15

df[mid_date_mask]

但是當一個月沒有第 15 天時,我無法理解如何退后一步。

我將非常感謝您的幫助!

如果以下內容適合您,您可以嘗試:

mid_date_idx = (
    (df["date"].dt.day - 15).abs()
    .groupby([df["date"].dt.year, df["date"].dt.month])
    .idxmin()
    .to_list()
)
mid_date_mask = df.index.isin(mid_date_idx)
  • df是你的 dataframe
  • 首先使用日期和15的絕對差異從列date構建一個系列。
  • 然后按年-月對對結果進行分組,使用.idxmin()獲取每組最小值的第一個索引,並將它們收集到一個列表mid_date_idx中。
  • 通過檢查索引是否在列表中來構建mid_date_mask

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM