Обработка даты и времени с питоном и пандами - PullRequest
0 голосов
/ 23 октября 2018

Я занимаюсь проектом, который включает анализ данных журнала WhatsApp.После предварительной обработки файла журнала у меня есть таблица, которая выглядит следующим образом:

DD/MM/YY | hh:mm | name | text | 

Я мог бы построить график, где, используя чат с моим другом, я построил график количества текста в месяци среднее количество слов в месяц, но у меня есть некоторые проблемы:

  • Если в течение месяца мы не обменивались текстом, алгоритм не считает этот месяц, поэтому на графике я хочу видетьв тот месяц с 0 сообщениями
  • есть лучший способ использовать даты и время в python?Использование их в качестве строк не так интуитивно понятно, но в Интернете я не нашел ничего полезного.

это страница GitLab моего проекта.

  def wapp_split(line):

      splitted = line.split(',')
      Data['date'].append(splitted[0])
      splitted = splitted[1].split(' - ')
      Data['time'].append(splitted[0])
      splitted = splitted[1].split(':')
      Data['name'].append(splitted[0])
      Data['msg'].append(splitted[1][0:-1])


   def wapp_parsing(file):
      with open(file) as f:
          data = f.readlines()
          for line in data:
              if (line[17:].find(':')!= -1):
                  if (line[0] in numbers) and (line[1]in numbers):

                      prev = line[0:35]
                      wapp_split(line)
                  else:

                      line = prev + line
                      wapp_split(line)

Это основная функция скрипта.Журнал WhatsApp отформатирован следующим образом:

DD/MM/YY, hh:mm - Name Surname: This is a text sent using WhatsApp

Функция синтаксического анализа просто берет файл и отправляет каждую строку в функцию split .Те, кто в функции синтаксического анализа, просто избегают, чтобы сообщения из WhatsApp, а не от людей в чате, анализировались.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Предположим, что ваша таблица представляет собой CSV-файл, который выглядит следующим образом (назовите его msgs.csv):

date;time;name;text
22/10/2018;11:30;Maria;Hello how are you
23/10/2018;11:30;Justin;Check this
23/10/2018;11:31;Justin;link
22/11/2018;11:30;Maria;Hello how are you
23/11/2018;11:30;Justin;Check this
23/12/2018;11:31;Justin;link
22/12/2018;11:30;Maria;Hello how are you
23/12/2018;11:30;Justin;Check this
23/01/2019;11:31;Justin;link
23/04/2019;11:30;Justin;Check this
23/07/2019;11:31;Justin;link

Теперь вы можете использовать pandas для импорта этого CSV в формате таблицы, который будетраспознайте дату и время как объект отметки времени, а затем для своих вычислений вы можете сгруппировать данные по месяцам.

import pandas as pd
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y %H:%M')
df = pd.read_csv('msgs.csv', delimiter=';', parse_dates=[['date', 'time']], date_parser=dateparse)

per = df.date_time.dt.to_period("M")
g = df.groupby(per)

for i in g:
    print('#######')
    print('year: {year} ; month: {month} ; number of messages: {n_msgs}'
          .format(year=i[0].year, month=i[0].month, n_msgs=len(i[1])))

РЕДАКТИРОВАТЬ - нет информации о конкретном месяце = 0 сообщений:

В порядкечтобы получить 0 за месяцы, в которые не было отправлено ни одного сообщения, вы можете сделать это (выглядит лучше, чем выше):

import pandas as pd
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y %H:%M')
df = pd.read_csv('msgs.csv', delimiter=';', parse_dates=[['date', 'time']], date_parser=dateparse)

# create date range from oldest message to newest message
dates = pd.date_range(*(pd.to_datetime([df.date_time.min(), df.date_time.max()]) + pd.offsets.MonthEnd()), freq='M')

for i in dates:
    df_aux = df[(df.date_time.dt.month == i.month) & (df.date_time.dt.year == i.year)]

    print('year: {year} ; month: {month} ; number of messages: {n_msgs}'
          .format(year=i.year, month=i.month, n_msgs=len(df_aux)))

РЕДАКТИРОВАТЬ 2: анализировать журналы в фрейме данных pandas:

df = pd.DataFrame({'logs':['DD/MM/YY, hh:mm - Name Surname: This is a text sent using WhatsApp',
                   'DD/MM/YY, hh:mm - Name Surname: This is a text sent using WhatsApp']})

pat = re.compile("(?P<date>.*?), (?P<time>.*?) - (?P<name>.*?): (?P<message>.*)")

df_parsed = df.logs.str.extractall(pat)
0 голосов
/ 23 октября 2018

Простое решение для добавления пропущенных дат и построения среднего значения msg_len - создать диапазон дат, который вас интересует, и затем переиндексировать:

df.set_index('date', inplace=True)
df1 = df[['msg_len','year']]
df1.index = df1.index.to_period('m')

         msg_len   year
date        
2016-08   11       2016
2016-08    4       2016
2016-08    3       2016
2016-08    4       2016
2016-08   15       2016
2016-10   10       2016

# look for date range between 7/2016 and 11/2016
idx = pd.date_range('7-01-2016','12-01-2016',freq='M').to_period('m')
new_df = pd.DataFrame(df1.groupby(df1.index)['msg_len'].mean()).reindex(idx, fill_value=0)
new_df.plot()

        msg_len
2016-07   0.0
2016-08   7.4
2016-09   0.0
2016-10   10.0
2016-11   0.0

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

0 голосов
/ 23 октября 2018

Лучше всего преобразовывать строки в объекты даты и времени

from datetime import datetime

datetime_object = datetime.strptime('22/10/18', '%d/%m/%y')

При преобразовании из строки не забывайте использовать правильные разделители, то есть "-" или "/", чтобы соответствовать строке, и буквыв шаблоне формата в правой части функции, чтобы проанализировать и строку даты тоже.Полную информацию о значении букв можно найти в Python strptime () Метод

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