熊猫创建没有周末的日期范围

Posted

技术标签:

【中文标题】熊猫创建没有周末的日期范围【英文标题】:Pandas Create Range of Dates Without Weekends 【发布时间】:2016-10-05 13:29:00 【问题描述】:

给定以下数据框:

import pandas as pd
df=pd.DataFrame('A':['a','b','c'],
        'first_date':['2015-08-31 00:00:00','2015-08-24 00:00:00','2015-08-25 00:00:00'])
df.first_date=pd.to_datetime(df.first_date) #(dtype='<M8[ns]')
df['last_date']=pd.to_datetime('5/6/2016') #(dtype='datetime64[ns]')
df

    A   first_date   last_date
0   a   2015-08-31  2016-05-06
1   b   2015-08-24  2016-05-06
2   c   2015-08-25  2016-05-06

我想创建一个新列,其中包含“first_date”和“last_date”之间的日期列表(或数组),不包括周末。

到目前为止,我已经尝试过:

pd.date_range(df['first_date'],df['last_date'])

...但是会出现这个错误:

TypeError: Cannot convert input to Timestamp

我在 pd.date_range 之前也试过这个...

pd.Timestamp(df['first_date'])

...但没有骰子。

提前致谢!

PS:

在这个障碍之后,我将尝试查看其他日期列表,如果它们属于生成的数组('A' 中的每行),然后将它们从列表或数组中减去)。我会把它作为一个单独的问题发布。

【问题讨论】:

【参考方案1】:

freq='B' 给你工作日,或者没有周末。

你的错误:

TypeError:无法将输入转换为时间戳

pd.date_range 函数期待Timestamp 时,您是否将序列传递给它的结果

改为使用apply

但是,我仍然觉得将列表放入数据框的特定单元格中很棘手。我使用的方式是使用pd.Series([mylist])。请注意,它是列表的列表。如果只是pd.Series(mylist) pandas 会将列表转换为系列,您将获得一系列系列,即数据框。

尝试:

def fnl(x):
    l = pd.date_range(x.loc['first_date'], x.loc['last_date'], freq='B')
    return pd.Series([l])

df['range'] = df.apply(fnl, axis=1)

【讨论】:

谢谢!那么,您是如何通过在数据帧上使用 apply 并获取一系列列表来解决时间戳的要求的呢? 你在做date_range(timeseries1, timeseries2),而应该是date_range(timestamp1, timestampe2)。通过使用apply(axis=1),我们逐行获取该行的时间戳并获取该行的日期范围。 series/listOlist 只是将列表放入单个数据框单元格的技巧。我们也可以做其他事情。 再次感谢。此处发布后续问题:***.com/questions/37653493/…

以上是关于熊猫创建没有周末的日期范围的主要内容,如果未能解决你的问题,请参考以下文章

使用熊猫创建每小时/每分钟时间范围

jquery ui 多日期选择器数据范围没有周末

如何在没有周末的情况下获取日期范围之间的所有日期?

在熊猫中传播范围日期

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

加入带有日期范围的熊猫时间序列