【问题标题】:Pandas updating weekend date to nearest business day熊猫将周末日期更新为最近的工作日
【发布时间】:2017-04-11 08:23:08
【问题描述】:

我有一个当前看起来像这样的数据框:

raw_data = {'AllDate':['2017-04-05','2017-04-06','2017-04-07','2017-04-08','2017-04-09']}
import pandas as pd
df = pd.DataFrame(raw_data,columns=['AllDate'])
print df

我想在此数据框中添加一个 WeekDate 列,例如,如果“AllDate”中的日期是周末,那么“WeekDate”列的日期是上周五。如果日期在工作日,则日期应保持不变。

例如,生成的 DataFrame 应如下所示:

raw_data = {'AllDate':['2017-04-05','2017-04-06','2017-04-07','2017-04-08','2017-04-09'],'WeekDate':['2017-04-05','2017-04-06','2017-04-07','2017-04-07','2017-04-07']}
import pandas as pd
df = pd.DataFrame(raw_data,columns=['AllDate','WeekDate'])
print df

有什么想法可以实现吗?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    这效果最好(添加到 Zhe 发布的答案中):

    import pandas as pd
    import time
    from datetime import datetime,timedelta
    df = pd.DataFrame({'AllDate':['2017-04-05','2017-04-06','2017-04-07','2017-04-08','2017-04-09']})
    df['WeekDate'] = [x if x.weekday() not in [5,6] else x - timedelta(days = (x.weekday()-4)) for x in pd.to_datetime(df['AllDate'])]
    

    【讨论】:

      【解决方案2】:

      试试:

      import pandas as pd
      import time
      
      df = pd.DataFrame({
          'AllDate':['2017-04-05','2017-04-06','2017-04-07','2017-04-08','2017-04-09']
      })
      df['WeekDate'] = [
          x if x.weekday() not in [5,6] else None for x in pd.to_datetime(df['AllDate'])
      ]
      print(df.ffill())
      

      【讨论】:

      • 为什么 else 'Non' 并使用以前的值?在这种情况下不起作用:
      • raw_data = {'AllDate':['2017-03-17','2017-04-16','2017-05-14','2017-06-‌​18', '2017-07-18']} import pandas as pd df = pd.DataFrame(raw_data,columns=['AllDate']) print df
      【解决方案3】:

      这可能是一个更简单的答案,它在处理时间序列等方面出现了很多问题。关键是Pandas tseries 中可用的偏移对象

      df = pd.DataFrame({"AllDate": ["2017-04-01", "2017-04-02", "2017-04-03", "2017-04-04", "2017-04-09"]})
      df["AllDate"] = pd.to_datetime(df["AllDate"])
      df["PrevBusDate"] = df["AllDate"].apply(pd.tseries.offsets.BusinessDay().rollback)
      
      df.head()
      ...
      >>>    AllDate PrevBusDate
      0   2017-04-01  2017-03-31
      1   2017-04-02  2017-03-31
      2   2017-04-03  2017-04-03
      3   2017-04-04  2017-04-04
      4   2017-04-09  2017-04-07
      

      注意:如果您不想,不必转换“AllDate”列。可以简单地生成偏移量并随心所欲地使用它们,例如:

      [pd.tseries.offsets.BusinessDay().rollback(d) for d in pd.to_datetime(df["AllDate"])]
      

      【讨论】:

        猜你喜欢
        • 2017-06-05
        • 1970-01-01
        • 2020-02-20
        • 2018-12-31
        • 2017-08-24
        • 1970-01-01
        • 2019-06-23
        • 2015-09-19
        • 2018-08-09
        相关资源
        最近更新 更多