熊猫将周末日期更新为最近的工作日

时间:2017-04-11 08:23:09

标签: python python-2.7 pandas

我的数据框目前看起来像这样:

TIMESTAMP=`$CURL -X POST -H
"Content-type: application/x-www-form-urlencoded" \
--data "admin-username=${USER}" --data "admin-password=${PASS}" \
--data "realm=${SEC_REALM}" \
http://${HOST}:8001/admin/v1/instance-admin`

我想在此数据框中添加一个WeekDate列,例如“AllDate'”中的日期。周末来临,周末日期'列具有从星期五之前的日期。如果日期在工作日,则日期应保持不变。

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

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

我是如何实现这一目标的?

3 个答案:

答案 0 :(得分:0)

尝试:

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())

答案 1 :(得分:0)

这个效果最好(加上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 :(得分:0)

这可能是一个更简单的答案,涉及很多时间序列等。关键是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"])]