从一系列开始和结束日期生成熊猫数据框

Posted

技术标签:

【中文标题】从一系列开始和结束日期生成熊猫数据框【英文标题】:Generate pandas dataframe from a series of start and end dates 【发布时间】:2017-02-20 06:31:11 【问题描述】:

我有开始和结束日期的列表,我想将它们转换成 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

有没有比创建数据列表并将它们粘合在一起更有效的方法?

谢谢!

【问题讨论】:

【参考方案1】:

还是有点笨拙,但可能比你的效率更高,因为它都是 numpy.将数据框与适当的日期差异合并

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)

【讨论】:

0.00799989700317 秒为我的方法,0.0120000839233 为 numpy 方法,速度较慢,但​​可能我添加的范围越多,您的方法效率越高

以上是关于从一系列开始和结束日期生成熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用两个数据框比较开始日期和结束日期之间的日期

熊猫周工作日开始和结束

在熊猫中生成给定范围内的随机日期

如何从一系列数组构造熊猫数据框

在熊猫中传播范围日期

如何打印数据框的开始日期和结束日期?