Reputation: 3528
I have a df
as follows:
dates Samstag Sonntag Werktag day
2020-01-01 00:15:00 95.3 87.8 94.7 Werktag
2020-01-01 00:30:00 95.5 88.3 94.1 Werktag
2020-01-01 00:45:00 96.2 89.0 94.1 Werktag
2020-01-01 01:00:00 97.4 90.1 95.0 Werktag
2020-01-01 01:15:00 98.9 91.3 96.6 Werktag
2020-01-01 01:30:00 100.3 92.4 98.4 Werktag
2020-01-01 01:45:00 101.0 92.9 99.8 Werktag
2020-01-01 02:00:00 100.4 92.5 99.8 Werktag
2020-01-01 02:15:00 98.2 91.0 98.0 Werktag
2020-01-01 02:30:00 95.1 88.7 95.1 Werktag
2020-01-01 02:45:00 91.9 86.4 91.9 Werktag
2020-01-01 03:00:00 89.5 84.7 89.5 Werktag
2020-01-01 03:15:00 88.6 84.0 88.4 Werktag
2020-01-01 03:30:00 88.6 84.0 88.3 Werktag
2020-01-01 03:45:00 88.7 84.0 88.3 Werktag
2020-01-01 04:00:00 88.3 83.5 87.7 Werktag
2020-01-01 04:15:00 86.8 82.1 86.1 Werktag
2020-01-01 04:30:00 85.1 80.6 84.3 Werktag
The values in the dates
column are from 2020-01-01 00:15:00
till 2021-01-01 00:00:00
.
I have a list of dates in string form:
holidays = ['2020-01-01', '2020-04-10']
What I am trying to do is to compare the dates in the dates
column with the dates in the holiday
list, and when the date exists in the holidays
list, I want to change the corresponding value in the day
column to Sonntag
I tried:
holidays = ['2020-01-01', '2020-04-10']
for holiday in holidays:
if (df.dates == pd.Timestamp(holiday)).any():
df['day'] = 'Sonntag'
It didn't work, and then I tried
for holiday in holidays:
if(df['dates'] == pd.Timestamp(holiday)).any():
print(df['dates'] == pd.Timestamp(holiday))
And it gives me the following output:
0 False
1 False
2 False
3 False
4 False
35131 False
35132 False
35133 False
35134 False
35135 False
Name: dates, Length: 35136, dtype: bool
Can anyone please tell me what is the mistake that I am doing?
Expected output
dates Samstag Sonntag Werktag day
2020-01-01 00:15:00 95.3 87.8 94.7 Sonntag
2020-01-01 00:30:00 95.5 88.3 94.1 Sonntag
2020-01-01 00:45:00 96.2 89.0 94.1 Sonntag
2020-01-01 01:00:00 97.4 90.1 95.0 Sonntag
2020-01-01 01:15:00 98.9 91.3 96.6 Sonntag
2020-01-01 01:30:00 100.3 92.4 98.4 Sonntag
2020-01-01 01:45:00 101.0 92.9 99.8 Sonntag
2020-01-01 02:00:00 100.4 92.5 99.8 Sonntag
2020-01-01 02:15:00 98.2 91.0 98.0 Sonntag
2020-01-01 02:30:00 95.1 88.7 95.1 Sonntag
2020-01-01 02:45:00 91.9 86.4 91.9 Sonntag
2020-01-01 03:00:00 89.5 84.7 89.5 Sonntag
2020-01-01 03:15:00 88.6 84.0 88.4 Sonntag
2020-01-01 03:30:00 88.6 84.0 88.3 Sonntag
2020-01-01 03:45:00 88.7 84.0 88.3 Sonntag
2020-01-01 04:00:00 88.3 83.5 87.7 Sonntag
2020-01-01 04:15:00 86.8 82.1 86.1 Sonntag
2020-01-01 04:30:00 85.1 80.6 84.3 Sonntag
and similarly for the date 2020-04-10
Edit 1
My df
dates Samstag Sonntag Werktag day
2020-01-01 00:15:00 95.3 87.8 94.7 Werktag
2020-01-01 00:30:00 95.5 88.3 94.1 Werktag
2020-01-01 00:45:00 96.2 89.0 94.1 Werktag
2020-01-01 01:00:00 97.4 90.1 95.0 Werktag
2020-01-01 01:15:00 98.9 91.3 96.6 Werktag
2020-01-01 01:30:00 100.3 92.4 98.4 Werktag
2020-01-01 01:45:00 101.0 92.9 99.8 Werktag
2020-01-01 02:00:00 100.4 92.5 99.8 Werktag
2020-01-01 02:15:00 98.2 91.0 98.0 Werktag
2020-01-01 02:30:00 95.1 88.7 95.1 Werktag
2020-01-01 02:45:00 91.9 86.4 91.9 Werktag
2020-01-01 03:00:00 89.5 84.7 89.5 Werktag
2020-01-01 03:15:00 88.6 84.0 88.4 Werktag
2020-01-01 03:30:00 88.6 84.0 88.3 Werktag
2020-01-01 03:45:00 88.7 84.0 88.3 Werktag
2020-01-01 04:00:00 88.3 83.5 87.7 Werktag
2020-01-01 04:15:00 86.8 82.1 86.1 Werktag
2020-01-01 04:30:00 85.1 80.6 84.3 Werktag
2020-01-01 04:45:00 84.2 80.1 83.5 Werktag
2020-01-01 05:00:00 85.3 81.6 84.7 Werktag
2020-01-01 05:15:00 89.0 85.9 88.5 Werktag
2020-01-01 05:30:00 94.1 91.6 94.0 Werktag
2020-01-01 05:45:00 99.3 97.0 99.5 Werktag
2020-01-01 06:00:00 102.8 100.4 103.4 Werktag
2020-01-01 06:15:00 103.7 100.7 104.7 Werktag
2020-01-01 06:30:00 102.6 98.8 104.0 Werktag
2020-01-01 06:45:00 100.7 96.2 102.4 Werktag
2020-01-01 07:00:00 99.2 94.3 101.0 Werktag
2020-01-01 07:15:00 99.1 94.4 100.8 Werktag
2020-01-01 07:30:00 100.8 95.7 102.1 Werktag
2020-01-01 07:45:00 104.4 97.6 105.3 Werktag
2020-01-01 08:00:00 110.1 99.2 110.7 Werktag
2020-01-01 08:15:00 117.7 99.7 118.2 Werktag
2020-01-01 08:30:00 126.1 99.6 126.7 Werktag
2020-01-01 08:45:00 133.9 99.2 134.7 Werktag
2020-01-01 09:00:00 139.7 99.2 140.9 Werktag
2020-01-01 09:15:00 142.4 99.8 144.2 Werktag
2020-01-01 09:30:00 142.9 100.9 145.4 Werktag
2020-01-01 09:45:00 142.4 102.1 145.5 Werktag
2020-01-01 10:00:00 142.1 102.8 145.8 Werktag
2020-01-01 10:15:00 142.9 102.9 147.0 Werktag
2020-01-01 10:30:00 144.5 102.5 149.0 Werktag
2020-01-01 10:45:00 146.3 101.8 151.2 Werktag
2020-01-01 11:00:00 147.6 101.0 153.0 Werktag
2020-01-01 11:15:00 147.9 100.4 154.0 Werktag
2020-01-01 11:30:00 147.5 100.0 154.3 Werktag
2020-01-01 11:45:00 146.8 99.8 154.3 Werktag
2020-01-01 12:00:00 146.4 99.8 154.2 Werktag
2020-01-01 12:15:00 146.3 100.0 154.3 Werktag
2020-01-01 12:30:00 146.5 100.5 154.5 Werktag
2020-01-01 12:45:00 146.2 101.0 154.3 Werktag
2020-01-01 13:00:00 145.1 101.6 153.6 Werktag
2020-01-01 13:15:00 142.8 102.2 152.2 Werktag
2020-01-01 13:30:00 139.3 102.4 149.9 Werktag
2020-01-01 13:45:00 134.6 102.1 147.0 Werktag
2020-01-01 14:00:00 128.8 101.0 143.3 Werktag
2020-01-01 14:15:00 122.3 98.9 139.2 Werktag
2020-01-01 14:30:00 115.5 96.3 135.2 Werktag
2020-01-01 14:45:00 109.4 93.8 132.1 Werktag
2020-01-01 15:00:00 104.6 91.9 130.6 Werktag
2020-01-01 15:15:00 101.8 91.1 131.3 Werktag
2020-01-01 15:30:00 100.5 91.2 133.5 Werktag
2020-01-01 15:45:00 100.2 91.8 136.2 Werktag
2020-01-01 16:00:00 100.4 92.5 138.5 Werktag
2020-01-01 16:15:00 100.6 93.1 139.8 Werktag
2020-01-01 16:30:00 101.0 93.4 140.3 Werktag
2020-01-01 16:45:00 101.9 93.6 140.5 Werktag
2020-01-01 17:00:00 103.4 93.7 140.9 Werktag
2020-01-01 17:15:00 105.8 93.9 142.0 Werktag
2020-01-01 17:30:00 108.7 94.3 143.7 Werktag
2020-01-01 17:45:00 111.5 95.2 145.8 Werktag
2020-01-01 18:00:00 113.7 96.8 148.2 Werktag
2020-01-01 18:15:00 115.0 99.1 150.6 Werktag
2020-01-01 18:30:00 115.7 102.2 152.5 Werktag
2020-01-01 18:45:00 116.3 105.7 153.3 Werktag
2020-01-01 19:00:00 117.3 109.5 152.4 Werktag
2020-01-01 19:15:00 119.0 113.2 149.3 Werktag
2020-01-01 19:30:00 120.6 116.3 144.4 Werktag
2020-01-01 19:45:00 121.4 117.9 138.4 Werktag
2020-01-01 20:00:00 120.4 117.3 131.8 Werktag
2020-01-01 20:15:00 117.0 114.2 125.3 Werktag
2020-01-01 20:30:00 112.1 109.4 119.3 Werktag
2020-01-01 20:45:00 106.8 104.2 114.3 Werktag
2020-01-01 21:00:00 102.2 99.8 110.7 Werktag
2020-01-01 21:15:00 99.2 97.1 108.8 Werktag
2020-01-01 21:30:00 97.4 95.9 108.1 Werktag
2020-01-01 21:45:00 96.4 95.4 108.0 Werktag
2020-01-01 22:00:00 95.6 95.0 107.7 Werktag
2020-01-01 22:15:00 94.5 94.1 106.6 Werktag
2020-01-01 22:30:00 93.3 92.8 104.9 Werktag
2020-01-01 22:45:00 92.0 91.2 103.0 Werktag
2020-01-01 23:00:00 90.7 89.5 101.0 Werktag
2020-01-01 23:15:00 89.6 87.8 99.3 Werktag
2020-01-01 23:30:00 88.6 86.4 97.8 Werktag
2020-01-01 23:45:00 88.0 85.7 96.6 Werktag
2020-01-02 00:00:00 87.7 85.9 95.6 Werktag
2020-01-02 00:15:00 95.3 87.8 94.7 Werktag
2020-01-02 00:30:00 95.5 88.3 94.1 Werktag
Expected output
dates Samstag Sonntag Werktag day
2020-01-01 00:15:00 95.3 87.8 94.7 Sonntag
2020-01-01 00:30:00 95.5 88.3 94.1 Sonntag
2020-01-01 00:45:00 96.2 89.0 94.1 Sonntag
2020-01-01 01:00:00 97.4 90.1 95.0 Sonntag
2020-01-01 01:15:00 98.9 91.3 96.6 Sonntag
2020-01-01 01:30:00 100.3 92.4 98.4 Sonntag
2020-01-01 01:45:00 101.0 92.9 99.8 Sonntag
2020-01-01 02:00:00 100.4 92.5 99.8 Sonntag
2020-01-01 02:15:00 98.2 91.0 98.0 Sonntag
2020-01-01 02:30:00 95.1 88.7 95.1 Sonntag
2020-01-01 02:45:00 91.9 86.4 91.9 Sonntag
2020-01-01 03:00:00 89.5 84.7 89.5 Sonntag
2020-01-01 03:15:00 88.6 84.0 88.4 Sonntag
2020-01-01 03:30:00 88.6 84.0 88.3 Sonntag
2020-01-01 03:45:00 88.7 84.0 88.3 Sonntag
2020-01-01 04:00:00 88.3 83.5 87.7 Sonntag
2020-01-01 04:15:00 86.8 82.1 86.1 Sonntag
2020-01-01 04:30:00 85.1 80.6 84.3 Sonntag
2020-01-01 04:45:00 84.2 80.1 83.5 Sonntag
2020-01-01 05:00:00 85.3 81.6 84.7 Sonntag
2020-01-01 05:15:00 89.0 85.9 88.5 Sonntag
2020-01-01 05:30:00 94.1 91.6 94.0 Sonntag
2020-01-01 05:45:00 99.3 97.0 99.5 Sonntag
2020-01-01 06:00:00 102.8 100.4 103.4 Sonntag
2020-01-01 06:15:00 103.7 100.7 104.7 Sonntag
2020-01-01 06:30:00 102.6 98.8 104.0 Sonntag
2020-01-01 06:45:00 100.7 96.2 102.4 Sonntag
2020-01-01 07:00:00 99.2 94.3 101.0 Sonntag
2020-01-01 07:15:00 99.1 94.4 100.8 Sonntag
2020-01-01 07:30:00 100.8 95.7 102.1 Sonntag
2020-01-01 07:45:00 104.4 97.6 105.3 Sonntag
2020-01-01 08:00:00 110.1 99.2 110.7 Sonntag
2020-01-01 08:15:00 117.7 99.7 118.2 Sonntag
2020-01-01 08:30:00 126.1 99.6 126.7 Sonntag
2020-01-01 08:45:00 133.9 99.2 134.7 Sonntag
2020-01-01 09:00:00 139.7 99.2 140.9 Sonntag
2020-01-01 09:15:00 142.4 99.8 144.2 Sonntag
2020-01-01 09:30:00 142.9 100.9 145.4 Sonntag
2020-01-01 09:45:00 142.4 102.1 145.5 Sonntag
2020-01-01 10:00:00 142.1 102.8 145.8 Sonntag
2020-01-01 10:15:00 142.9 102.9 147.0 Sonntag
2020-01-01 10:30:00 144.5 102.5 149.0 Sonntag
2020-01-01 10:45:00 146.3 101.8 151.2 Sonntag
2020-01-01 11:00:00 147.6 101.0 153.0 Sonntag
2020-01-01 11:15:00 147.9 100.4 154.0 Sonntag
2020-01-01 11:30:00 147.5 100.0 154.3 Sonntag
2020-01-01 11:45:00 146.8 99.8 154.3 Sonntag
2020-01-01 12:00:00 146.4 99.8 154.2 Sonntag
2020-01-01 12:15:00 146.3 100.0 154.3 Sonntag
2020-01-01 12:30:00 146.5 100.5 154.5 Sonntag
2020-01-01 12:45:00 146.2 101.0 154.3 Sonntag
2020-01-01 13:00:00 145.1 101.6 153.6 Sonntag
2020-01-01 13:15:00 142.8 102.2 152.2 Sonntag
2020-01-01 13:30:00 139.3 102.4 149.9 Sonntag
2020-01-01 13:45:00 134.6 102.1 147.0 Sonntag
2020-01-01 14:00:00 128.8 101.0 143.3 Sonntag
2020-01-01 14:15:00 122.3 98.9 139.2 Sonntag
2020-01-01 14:30:00 115.5 96.3 135.2 Sonntag
2020-01-01 14:45:00 109.4 93.8 132.1 Sonntag
2020-01-01 15:00:00 104.6 91.9 130.6 Sonntag
2020-01-01 15:15:00 101.8 91.1 131.3 Sonntag
2020-01-01 15:30:00 100.5 91.2 133.5 Sonntag
2020-01-01 15:45:00 100.2 91.8 136.2 Sonntag
2020-01-01 16:00:00 100.4 92.5 138.5 Sonntag
2020-01-01 16:15:00 100.6 93.1 139.8 Sonntag
2020-01-01 16:30:00 101.0 93.4 140.3 Sonntag
2020-01-01 16:45:00 101.9 93.6 140.5 Sonntag
2020-01-01 17:00:00 103.4 93.7 140.9 Sonntag
2020-01-01 17:15:00 105.8 93.9 142.0 Sonntag
2020-01-01 17:30:00 108.7 94.3 143.7 Sonntag
2020-01-01 17:45:00 111.5 95.2 145.8 Sonntag
2020-01-01 18:00:00 113.7 96.8 148.2 Sonntag
2020-01-01 18:15:00 115.0 99.1 150.6 Sonntag
2020-01-01 18:30:00 115.7 102.2 152.5 Sonntag
2020-01-01 18:45:00 116.3 105.7 153.3 Sonntag
2020-01-01 19:00:00 117.3 109.5 152.4 Sonntag
2020-01-01 19:15:00 119.0 113.2 149.3 Sonntag
2020-01-01 19:30:00 120.6 116.3 144.4 Sonntag
2020-01-01 19:45:00 121.4 117.9 138.4 Sonntag
2020-01-01 20:00:00 120.4 117.3 131.8 Sonntag
2020-01-01 20:15:00 117.0 114.2 125.3 Sonntag
2020-01-01 20:30:00 112.1 109.4 119.3 Sonntag
2020-01-01 20:45:00 106.8 104.2 114.3 Sonntag
2020-01-01 21:00:00 102.2 99.8 110.7 Sonntag
2020-01-01 21:15:00 99.2 97.1 108.8 Sonntag
2020-01-01 21:30:00 97.4 95.9 108.1 Sonntag
2020-01-01 21:45:00 96.4 95.4 108.0 Sonntag
2020-01-01 22:00:00 95.6 95.0 107.7 Sonntag
2020-01-01 22:15:00 94.5 94.1 106.6 Sonntag
2020-01-01 22:30:00 93.3 92.8 104.9 Sonntag
2020-01-01 22:45:00 92.0 91.2 103.0 Sonntag
2020-01-01 23:00:00 90.7 89.5 101.0 Sonntag
2020-01-01 23:15:00 89.6 87.8 99.3 Sonntag
2020-01-01 23:30:00 88.6 86.4 97.8 Sonntag
2020-01-01 23:45:00 88.0 85.7 96.6 Sonntag
2020-01-02 00:00:00 87.7 85.9 95.6 Sonntag
2020-01-02 00:15:00 95.3 87.8 94.7 Werktag
2020-01-02 00:30:00 95.5 88.3 94.1 Werktag
As you can see in the last 3 rows, the value of day
column on 2020-01-02 00:00:00
has to be 'Sonntag' and then from 2020-01-02 00:15:00
it must be 'Werktag'.
Right now, doing
m = df['dates'].dt.strftime('%Y-%m-%d').isin(holidays)
df['day'] = np.where(m, 'Sonntag', df['day'])
makes the value at 2020-01-02 00:00:00
also as 'Werktag', which is wrong. Any idea how can this be done?
Upvotes: 1
Views: 314
Reputation: 862511
You can compare strings repr of datetimes created by Series.dt.strftime
with string in list:
m = df['dates'].dt.strftime('%Y-%m-%d').isin(holidays)
Or you can convert times to 0
by Series.dt.floor
and compre with datetimes
:
m = df['dates'].dt.floor('d').isin(pd.to_datetime(holidays))
Or compare with dates:
m = df['dates'].dt.date.isin(pd.to_datetime(holidays).date)
And then use numpy.where
:
df['day'] = np.where(m, 'Sonntag', 'Werktag')
EDIT:
holidays = ['2020-01-01', '2020-04-10']
holidays = pd.to_datetime(holidays).tolist()
comp = [(df['dates'] > h) & (df['dates'] <= h + pd.offsets.DateOffset(days=1))
for h in holidays]
#join all mask by logical or
mask = np.logical_or.reduce(comp)
#added new column
df['day'] = np.where(mask, 'Sonntag', 'Werktag')
print (df)
dates Samstag Sonntag Werktag day
0 2020-01-01 00:00:00 95.3 87.8 96.7 Werktag
1 2020-01-01 00:15:00 95.3 87.8 94.7 Sonntag
2 2020-01-01 00:30:00 95.5 88.3 94.1 Sonntag
3 2020-01-01 00:45:00 96.2 89.0 94.1 Sonntag
4 2020-01-01 23:45:00 88.0 85.7 96.6 Sonntag
5 2020-01-02 00:00:00 87.7 85.9 95.6 Sonntag
6 2020-01-02 00:15:00 95.3 87.8 94.7 Werktag
7 2020-01-02 00:30:00 95.5 88.3 94.1 Werktag
8 2020-04-10 00:00:00 96.4 95.4 108.0 Werktag
9 2020-04-10 00:15:00 96.4 95.4 108.0 Sonntag
10 2020-04-10 00:30:00 95.6 95.0 107.7 Sonntag
11 2020-04-11 00:00:00 92.0 91.2 103.0 Sonntag
12 2020-04-11 00:15:00 90.7 89.5 101.0 Werktag
Upvotes: 1