使用 Pandas 查找两个特定日期之间月份的最​​后一天和第一天

时间:2021-05-09 15:00:20

标签: python pandas datetime

我有一个包含“购买日期”和“销售日期”列的 Pandas 数据框。

假设数据框中的第一行看起来像:

<头>
购买日期 销售日期
2000-01-04 2000-04-15

我想创建一个新的数据框,以购买日期开始,以销售日期结束,在它们之间我想要购买日期和销售日期之间每个月的第一个日期和最后一个日期。所以它会给我类似的东西:

<头>
日期
2000-01-04
2000-01-31
2000-02-01
2000-02-28
2000-03-01
2000-03-31
2000-04-01
2000-04-15

有没有人对此有聪明的解决方案?

谢谢!

3 个答案:

答案 0 :(得分:3)

试试:

ms = pd.date_range('2000-01-04', '2000-04-15', freq='MS')
me = pd.date_range('2000-01-04', '2000-04-15', freq='M')
df.T.set_index(0).index.union(ms).union(me).to_frame().sort_index()

输出:

                    0
2000-01-04 2000-01-04
2000-01-31 2000-01-31
2000-02-01 2000-02-01
2000-02-29 2000-02-29
2000-03-01 2000-03-01
2000-03-31 2000-03-31
2000-04-01 2000-04-01
2000-04-15 2000-04-15

答案 1 :(得分:0)

我不知道这有多聪明,但它应该可以工作。

  • 从开始日期开始,使用 MonthBegin DateOffset
  • 创建一个日期范围
  • 从开始日期开始,使用 MonthEnd DateOffset 创建一个日期范围
  • 交错它们

import pandas as pd
import numpy as np
df = pd.DataFrame({'buying date':pd.to_datetime(['2000-01-04']),
                   'selling date':pd.to_datetime(['2000-04-15'])})
start,end = df.iloc[0]
lasts = pd.date_range(start,end,freq='M')
firsts = pd.date_range(start,end,freq='MS')
middle = np.vstack((lasts,firsts)).ravel('F')
start = np.array(start,dtype='datetime64[ns]')
end = np.array(end,dtype='datetime64[ns]')

s = pd.Series(np.hstack([start,middle,end]))

>>> print(s)
0   2000-01-04
1   2000-01-31
2   2000-02-01
3   2000-02-29
4   2000-03-01
5   2000-03-31
6   2000-04-01
7   2000-04-15
dtype: datetime64[ns]
>>>

答案 2 :(得分:0)

from datetime import date
import pandas as pd
import calendar

def main():
    start_date = date(2021, 1, 4)
    end_date = date(2021, 4, 15)

    dates = [start_date]
    for month in range(start_date.month, end_date.month+1):
        first_day_of_month = date(2021, month, 1)
        last_day_of_month = date(2021, month, calendar.monthrange(2021, month)[1])
        print(first_day_of_month)
        print(last_day_of_month)
        dates.append(first_day_of_month)
        dates.append(last_day_of_month)

    dates.append(end_date)

    df = pd.DataFrame({'dates': dates})

    print(df)
if __name__ == "__main__":
    main()
相关问题