# -*- coding: utf-8 -*-
"""
Created on Thu Dec 19 13:47:28 2019
@author: wagene002
"""
#https://stackoverflow.com/questions/43832484/expanding-a-dataframe-based-on-start-and-end-columns-speed
import numpy as np
import pandas as pd
from datetime import timedelta
import datetime as dt
df = pd.DataFrame()
df['BEGIN_DATUM'] = [dt.datetime(2010, 12, 31), dt.date(2013, 4, 5)]
df['EIND_DATUM'] = [dt.date(2011, 1, 3), dt.date(2016, 12, 12)]
df['country'] = ['US', 'EU']
df['letter'] = ['a', 'b']
df['bedrag'] = ['1200.0','44']
df['bedrag']= df['bedrag'].apply(lambda x : float(x))
df['diffdagen'] =((df['EIND_DATUM']-df['BEGIN_DATUM']) / np.timedelta64(1, 'D')).astype('int') + 1
!!!!
alternatieve manier: df['diffdagen'] = df.apply(lambda x: (x['EIND_DATUM']-x['BEGIN_DATUM']).days,axis=1)
!!!!
df['dagbedrag'] = df['bedrag']/ df['diffdagen']
cols = list(df.columns)
#bepaal per regel het data id
df['data_id'] = np.arange(0, len(df))
df['BEGIN_JAAR']=df['BEGIN_DATUM'].map(lambda x:x.year)
df['EIND_JAAR']=df['EIND_DATUM'].map(lambda x:x.year)
#stop data in series
data_id = df['data_id']
start1 = df['BEGIN_JAAR']
end1 = df['EIND_JAAR']
#diff = ((end-start) / np.timedelta64(1, 'Y')).astype('int') + 1
#bepaal hoeveel jaren er voorkomen in een regel
diff = (end1-start1) + 1
#genereer het data_id uit per aantal gevonden jaren
repeated_id = np.repeat(data_id, diff)
time_df = pd.DataFrame(data={'data_id': repeated_id})
time_df = pd.merge(left=time_df, right=df[['data_id', 'BEGIN_JAAR','EIND_JAAR']], on=['data_id'])
time_df['year_id'] = np.arange(0, len(time_df))
min_year_id = time_df.groupby('data_id')['year_id'].min().reset_index().rename(columns={'year_id': 'min_year_id'})
time_df = pd.merge(left=time_df, right=min_year_id, on=['data_id'])
#years_to_add = (time_df['year_id'] - time_df['min_year_id']) * np.timedelta64(1, 'Y')
years_to_add = (time_df['year_id'] - time_df['min_year_id'])
time_df['JAARTAL'] = time_df['BEGIN_JAAR'] + years_to_add
#time_df = time_df[time_df['JAARTAL'].dt.dayofweek < 5]
dfuit = pd.merge(left=df, right=time_df[['data_id', 'JAARTAL']], on=['data_id'])
def fBepaalAantalDagen(tseries):
ndagen=0
year_start=dt.date(tseries['JAARTAL'], 1, 1)
year_end=dt.date(tseries['JAARTAL'], 12, 31)
#startdatum ligt in het jaar zelf
if tseries['BEGIN_JAAR']== tseries['JAARTAL'] :
#start in jaar en einddatum ligt in jaren erna
if tseries['EIND_JAAR'] > tseries['JAARTAL'] :
#alleen de dagen van begindatum tot 31-12 berekeen
ndagen= ((year_end-tseries['BEGIN_DATUM']).days + 1)
#start en eind liggen in zelfde jaar
elif tseries['EIND_JAAR'] == tseries['JAARTAL']:
ndagen= ((tseries['EIND_DATUM']-tseries['BEGIN_DATUM']).days + 1)
#startdatum ligt voor het jaar zelf
if (tseries['BEGIN_JAAR'] < tseries['JAARTAL']) & (tseries['EIND_JAAR'] >= tseries['JAARTAL']) :
# start ligt voor het jaar en eind ligt na het jaar
if tseries['EIND_JAAR'] > tseries['JAARTAL'] :
#tel hele jaar
ndagen= ((year_end-year_start).days + 1)
# start ligt voor jaar en einde ligt in het jaar
elif tseries['EIND_JAAR'] == tseries['JAARTAL']:
#tel dagen vanaf 1-1 tm einde
ndagen= ((tseries['EIND_DATUM']-year_start).days + 1)
return ndagen
dfuit['aantal_dag_in_jaar']=dfuit.apply(lambda x: fBepaalAantalDagen(x),axis=1)
dfuit = dfuit[['JAARTAL']+cols]
t
Abonneren op:
Reacties posten (Atom)
Datums bepalen adhv begin en einddatum in Dataframe
Voorbeeld op losse velden ####################################################################### # import necessary packages from datetime...
-
value_counts geef per waarde het aantal voorkomens in een bepaalde df_iris.species.value_counts() versicolor 50 setosa 50 v...
-
import textfiles # Open a file: file file = open('opa.txt','r') # Print it print(file.read()) # Check whether file ...
-
scikit-learn, a standard library for machine learning in Python. It describes itself like this: Machine Learning in Python •Simple and...
Geen opmerkingen:
Een reactie posten