我有一些开始日期和结束日期,我希望将其转换为1个大型数据框。
这是我试图实现的一个小的可再现的例子
import pandas as pd
from pandas.tseries.offsets import *
import datetime as dt
dates = pd.DataFrame([[dt.datetime(2016,01,01),dt.datetime(2016,02,01)], [dt.datetime(2016,01,10), dt.datetime(2016,02,25)], [dt.datetime(2016,02,10), dt.datetime(2016,03,25)]], columns=['start', 'end'])
给出了我的开始和结束日期:
In[14]: dates
Out[14]:
start end
0 2016-01-01 2016-02-01
1 2016-01-10 2016-02-25
2 2016-02-10 2016-03-25
我试图根据这些开始/结束日期创建一个日期范围为工作日的数据框,并将它们附加在一起。
这就是我解决这个问题的方法,但它并没有让人感觉太多pythonic:
op_series = list()
for row in dates.itertuples():
time_range = pd.date_range(row.start, row.end, freq=BDay())
s = len(time_range)
op_series += (zip(time_range, [row.start]*s, [row.end]*s))
df = pd.DataFrame(op_series, columns=['date', 'start', 'end'])
In[4]: df.head()
Out[4]:
date start end
0 2016-01-01 2016-01-01 2016-02-01
1 2016-01-04 2016-01-01 2016-02-01
2 2016-01-05 2016-01-01 2016-02-01
3 2016-01-06 2016-01-01 2016-02-01
4 2016-01-07 2016-01-01 2016-02-01
是否有一种比创建数据列表更有效的方法,并将它们粘合在一起?
谢谢!
答案 0 :(得分:0)
仍然有点笨拙,但可能比你的更有效率,因为它都是笨拙的。将Dataframe与适当的日差合并
df = pd.DataFrame([[dt.datetime(2016,1,1),dt.datetime(2016,2,1)], [dt.datetime(2016,1,10), dt.datetime(2016,2,25)], [dt.datetime(2016,2,10), dt.datetime(2016,3,25)]], columns=['start', 'end'])
df['diff'] = (df['end'] - df['start']).dt.days
arr = np.empty(0, dtype=np.uint32)
diff_arr = np.empty(0, dtype=np.uint32)
for value in df['diff'].unique():
arr = np.append(arr, np.arange(value))
diff_arr = np.append(diff_arr, np.full(value, value, dtype=np.uint32))
tmp_df = pd.DataFrame(dict(diff=diff_arr, i=arr))
tmp_df['i'] = pd.to_timedelta(tmp_df['i'], unit='D')
df = df.merge(tmp_df, on='diff')
df['date'] = df['start'] + df['i']
df.drop(['i', 'diff'], inplace=True, axis=1)