JAG2024
JAG2024

Reputation: 4317

add column of new dates from existing columns using pandas

I have a data frame of dates and weeks that looks like this:

weeks = ["2016 W08","2016 W09","2016 W10","2016 W11"]
date = ["2-22-16", "2-29-16", "3-7-16", "3-14-16"]
df = pd.DataFrame(
{'week': weeks,
 'date': date,
 })
df
          date      week
0   2016-02-22  2016 W08
1   2016-02-29  2016 W09
2   2016-03-07  2016 W10
3   2016-03-14  2016 W11

And I'm trying to very simply create a new column end that is 7 days later than the value of date.

I totally suck at for loops, and am missing how to loop through each index.

import datetime
for row in df['date']:
    start_date = df[row]
    df['end_date'] = start_date + datetime.timedelta(days = 7)

I know I'm close to the answer but missing it!

Upvotes: 0

Views: 1435

Answers (2)

BENY
BENY

Reputation: 323226

from datetime import timedelta
df.date=pd.to_datetime(df.date)
df.date+timedelta(days=7)

Out[691]: 
0   2016-02-29
1   2016-03-07
2   2016-03-14
3   2016-03-21
Name: date, dtype: datetime64[ns]

If you need for loop:

import datetime
for i,row in df.iterrows():
    df.loc[i,'new']= row['date'] + datetime.timedelta(days = 7)
df
Out[698]: 
        date      week        new
0 2016-02-22  2016 W08 2016-02-29
1 2016-02-29  2016 W09 2016-03-07
2 2016-03-07  2016 W10 2016-03-14
3 2016-03-14  2016 W11 2016-03-21

EDIT : Why your loop does not work

for row in df['date']:
    start_date = row
    print(start_date + datetime.timedelta(days=7))

row in here return the value of date, you can not call df values by its own values.

Upvotes: 1

Tiny.D
Tiny.D

Reputation: 6556

Try with pd.DateOffset:

import pandas as pd
weeks = ["2016 W08","2016 W09","2016 W10","2016 W11"]
date = ["2-22-16", "2-29-16", "3-7-16", "3-14-16"]
df = pd.DataFrame(
{'week': weeks,
 'date': date,
 })
df['date'] = pd.to_datetime(df['date']) #convert date column to datetime format
df['end_date'] = pd.DatetimeIndex(df['date']) + pd.DateOffset(7) #create new column end_date which is 7 days later
df

df will be:

    date        week        end_date
0   2016-02-22  2016 W08    2016-02-29
1   2016-02-29  2016 W09    2016-03-07
2   2016-03-07  2016 W10    2016-03-14
3   2016-03-14  2016 W11    2016-03-21

Upvotes: 1

Related Questions