首页 > 解决方案 > 如何检查列表中是否存在日期以更改列的值?

问题描述

我有一个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

列中的值dates是从2020-01-01 00:15:00until 2021-01-01 00:00:00

我有一个字符串形式的日期列表:

holidays = ['2020-01-01', '2020-04-10']

我要做的是将dates列中的日期与holiday列表中的日期进行比较,当日期存在于holidays列表中时,我想将day列中的相应值更改为Sonntag

我试过:

holidays = ['2020-01-01', '2020-04-10']

for holiday in holidays:
    if (df.dates == pd.Timestamp(holiday)).any():
        df['day'] = 'Sonntag' 

没用,然后我试了

for holiday in holidays:
    if(df['dates'] == pd.Timestamp(holiday)).any():
        print(df['dates'] == pd.Timestamp(holiday))

它给了我以下输出:

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

谁能告诉我我在做什么错误?

预期产出

       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-04-10

编辑 1

我的

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

预期产出

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

正如您在最后 3 行中看到的,daycolumn on的值2020-01-02 00:00:00必须是“Sonntag”,然后2020-01-02 00:15:00它必须是“Werktag”。

现在,做

m = df['dates'].dt.strftime('%Y-%m-%d').isin(holidays)
df['day'] = np.where(m, 'Sonntag', df['day'])

将 at 的值2020-01-02 00:00:00也设为“Werktag”,这是错误的。知道怎么做吗?

标签: python-3.xpandas

解决方案


您可以将创建的日期时间的字符串 reprSeries.dt.strftime与列表中的字符串进行比较:

m = df['dates'].dt.strftime('%Y-%m-%d').isin(holidays)

或者您可以将时间转换为0bySeries.dt.floor并比较datetimes

m = df['dates'].dt.floor('d').isin(pd.to_datetime(holidays))

或与日期比较:

m = df['dates'].dt.date.isin(pd.to_datetime(holidays).date)

然后使用numpy.where

df['day'] = np.where(m, 'Sonntag', 'Werktag')

编辑:

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

推荐阅读