Решение периода месяца:
Сначала преобразуйте столбцы to_period
из months
, а также получите Period
из now
, а затем используйте itertuples
с period_range
, последний для datetimes использует to_timestamp
:
df['a'] = df['on_pm_at'].dt.to_period('m')
now = pd.Period(pd.datetime.now().strftime('%Y-%m'),freq='m')
print (now)
2018-07
df1 = pd.concat([pd.Series(r.user_id,pd.period_range(r.a, now, freq='m'))
for r in df.itertuples()]).reset_index()
df1.columns = ['months','user_id']
df1['months'] = df1['months'].dt.to_timestamp('m')
print (df1)
months user_id
0 2018-06-30 2124
1 2018-07-31 2124
2 2018-02-28 18420
3 2018-03-31 18420
4 2018-04-30 18420
5 2018-05-31 18420
6 2018-06-30 18420
7 2018-07-31 18420
Решение Datetime:
Аналогичный подход для последнего дня месяца преобразуется в month period
, а затем в timestamp
s и использует date_range
:
df['a'] = df['on_pm_at'].dt.to_period('m').dt.to_timestamp('m')
now = pd.Timestamp(pd.datetime.now()).to_period('m').to_timestamp('m')
2018-07-31 00:00:00
df1 = pd.concat([pd.Series(r.user_id,pd.date_range(r.a, now, freq='m'))
for r in df.itertuples()]).reset_index()
df1.columns = ['months','user_id']
print (df1)
months user_id
0 2018-06-30 2124
1 2018-07-31 2124
2 2018-02-28 18420
3 2018-03-31 18420
4 2018-04-30 18420
5 2018-05-31 18420
6 2018-06-30 18420
7 2018-07-31 18420
for item in data_dict:
for k, v in item.items():
if k == 'MATCH':
print('found')
вы не используете dict должным образом, просто используете его как список кортежей. Просто напишите:
for item in data_dict:
if 'MATCH' in item:
print('found: ',item['MATCH'])
# break here? not if you want multiple matches
то же самое касается другого цикла. Но я просто уменьшил сложность с O(n**2)
до O(n)
. Вы по-прежнему выполняете линейный поиск в списке словарей, но он все еще не подходит.
Другой способ: создать один словарь со списками ваших элементов в качестве элементов вместо списка словарей с элементами.
Таким образом, вы получаете всю информацию с помощью 1 ключевого поиска. Практический пример:
Скажем, ваши данные выглядят так:
list_of_dicts = [
{'MATCH':12, 'foo':14},
{'MATCH':5, 'bar':2},
{'what':0}
]
преобразуйте их в виде списков с помощью collections.defaultdict(list)
:
import collections
dict_of_lists = collections.defaultdict(list)
for d in list_of_dicts:
for k,v in d.items():
dict_of_lists[k].append(v)
Давайте посмотрим на новый дикт:
>>> dict_of_lists
{'MATCH': [12, 5],
'bar': [2],
'foo': [14],
'what': [0]}
, как только это будет сделано, просто получите все значения, соответствующие ключу с этим:
if 'MATCH' in dict_of_lists:
print(dict_of_lists['MATCH'])
, который печатает:
[12, 5]
Преобразование, выполненное в начале, должно быть выполнено только один раз (или не совсем, если данные правильно организованы с самого начала), чтобы получить супер быструю & amp; легкий поиск данных.