Как искать элементы списка во фрейме данных? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть список dates с датами в виде строковых объектов со всеми датами с 2003-01-01 по 2017-06-30:

['2003-01-01', '2003-01-02', '2003-01-03', '2003-01-04', '2003-01-05', '2003-01-06', '2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10', '2003-01-11', '2003-01-12', '2003-01-13', '2003-01-14', '2003-01-15', '2003-01-16', '2003-01-17', '2003-01-18', '2003-01-19', '2003-01-20', '2003-01-21',...]

И у меня есть датафрейм с объектами даты и времени:

0       2013-01-09 09:07:49
1       2013-01-09 09:16:25
2       2013-01-09 11:14:28
3       2013-01-09 11:25:51
4       2013-01-09 11:25:51
5       2013-01-09 11:33:35
6       2013-01-09 11:35:31
7       2013-01-09 18:11:03
8       2013-03-13 21:04:58
9       2013-03-13 21:05:57
10      2013-03-15 14:07:27
11      2013-03-26 21:53:35
12      2013-03-26 22:19:20
13      2013-04-09 14:21:48
14      2013-04-09 14:22:29
15      2013-04-09 14:22:45
16      2013-04-22 12:10:47
...

Затем я хочу проверить, существуют ли даты в списке dates в кадре данных. Поэтому я хочу сделать что-то вроде этого:

df = pd.read_csv("blabla.csv")
df['time'] = pd.to_datetime(df['time'])
for j in dates:
  if j in df['time']:
       return(yes)

Как сравнить строковый объект с объектом даты и времени в кадре данных?

Это мой полный код:

dates=[]       
start = date(2003, 1, 1)
end = date(2017, 6, 30)

delta = end - start

for i in range(delta.days + 1):
    newdate = start + timedelta(days=i)
    dates.append(newdate.strftime("%Y-%m-%d"))

df = pd.read_csv("blabla.csv",parse_dates=True)
df['time'] = pd.to_datetime(df['time'])

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Сначала мы конвертируем ваш столбец time в дату и время, поэтому мы можем получить доступ только к датам с Series.dt.dates. Когда мы извлекаем дату из вашей даты и времени, мы конвертируем ее в string, чтобы мы могли сравнить ее с вашим списком.

Наконец, мы используем метод isin, чтобы создать новый столбец в качестве индикатора.

df['Time'] = pd.to_datetime(df['Time'])

df['Indicator'] = df['Time'].dt.date.astype(str).isin(dates)

                  Time  Indicator
0  2013-01-09 09:07:49      False
1  2013-01-09 09:16:25      False
2  2013-01-09 11:14:28      False
3  2013-01-09 11:25:51      False
4  2013-01-09 11:25:51      False
5  2013-01-09 11:33:35      False
6  2013-01-09 11:35:31      False
7  2013-01-09 18:11:03      False
8  2013-03-13 21:04:58      False
9  2013-03-13 21:05:57      False
10 2013-03-15 14:07:27      False
11 2013-03-26 21:53:35      False
12 2013-03-26 22:19:20      False
13 2013-04-09 14:21:48      False
14 2013-04-09 14:22:29      False
15 2013-04-09 14:22:45      False
16 2013-04-22 12:10:47      False

Примечание : ваш список не очень хороший пример, поскольку ни одна из дат не существует в вашем фрейме данных, поэтому он возвращает все False.

Если я использую список, в котором есть некоторая дата вашего фрейма данных, он будет выглядеть следующим образом:

dates = ['2013-01-09', '2013-02-09', '2013-03-26']
df['Indicator'] = df['Time'].dt.date.astype(str).isin(dates)

                  Time  Indicator
0  2013-01-09 09:07:49       True
1  2013-01-09 09:16:25       True
2  2013-01-09 11:14:28       True
3  2013-01-09 11:25:51       True
4  2013-01-09 11:25:51       True
5  2013-01-09 11:33:35       True
6  2013-01-09 11:35:31       True
7  2013-01-09 18:11:03       True
8  2013-03-13 21:04:58      False
9  2013-03-13 21:05:57      False
10 2013-03-15 14:07:27      False
11 2013-03-26 21:53:35       True
12 2013-03-26 22:19:20       True
13 2013-04-09 14:21:48      False
14 2013-04-09 14:22:29      False
15 2013-04-09 14:22:45      False
16 2013-04-22 12:10:47      False

Обширная информация об isin: ссылка

0 голосов
/ 29 мая 2019

Вы можете использовать parse_dates при вызове read_csv

df = pd.read_csv("blabla.csv",parse_dates=True)

Это приведет к объектам datetime вместо строк.Затем вы можете использовать метод .isin, чтобы увидеть, находятся ли элементы одного столбца в другом.

df['time'].isin(dates)

Это вернет серию True и False для каждого значения в df ['time']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...