我有一个包含“购买日期”和“销售日期”列的 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 |
有没有人对此有聪明的解决方案?
谢谢!
答案 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)
我不知道这有多聪明,但它应该可以工作。
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()