Как работать с нестандартным форматом из CSV с помощью Pandas - PullRequest
0 голосов
/ 08 мая 2018

Я пробовал разные способы обработки даты и времени в Пандах из CSV.

У меня есть 3 столбца в CSV-файле:

  1. kickoffDate
  2. kickoffTime
  3. время

Первые два столбца хорошо отформатированы. Но формат третьего столбца "время" перепутан ... некоторые представляют как время, некоторые представляют как дату и время.

Например:

12:00:00 AM
1/1/1900 9:04:00 PM

Как мне сделать такой же формат, используя панд?

Во-вторых, я хочу добавить все три столбца, чтобы получить время события.

Например:

kickoffDate =['8/6/2017','8/6/2017','8/6/2017']
kickoffTime =['15:00:00','15:00:00','15:00:00']
time =['51:48:00','86:05:00','10:04']`

время в этом случае - mm:ss:00 формат. я хочу объединить эти три столбца, чтобы создать новый столбец, так называемый eventdatetime:

eventdatetime = [06-08-2017 15:51:48, 06-08-2017 16:26:05,06-08-2017 15:10:04]`

Как я могу это сделать? Я могу объединить первые два, используя следующую формулу:

DateTime1 = data['kickoffDate']+' '+ data ['kickoffTime']

Исходный файл csv можно скачать по ссылке ниже:

https://drive.google.com/open?id=1JL65x7nq2m6zk4qnaRUDKL894aEdXW_B

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете использовать параметр parse_dates с первым и вторым столбцами для datetimes, затем преобразовать последний столбец to_timedelta с добавлением 00: для часов для значений без единого ::

df = pd.read_csv('Datetimetest.csv', parse_dates=[[0, 1]])

m = df['time'].str.count(':') != 1
df['time'] = pd.to_timedelta('00:' + df['time'].mask(m, df['time'].str.replace(':00$', '')))
df['eventdatetime'] = df['kickoffDate_kickoffTime'] + df['time']
print (df.head())
  kickoffDate_kickoffTime     time       eventdatetime
0     2018-04-30 19:00:00 00:47:36 2018-04-30 19:47:36
1     2018-04-30 19:00:00 00:15:28 2018-04-30 19:15:28
2     2018-04-29 13:15:00 00:52:03 2018-04-29 14:07:03
3     2018-04-29 13:15:00 01:03:42 2018-04-29 14:18:42
4     2018-04-29 13:15:00 00:10:43 2018-04-29 13:25:43

Другое решение, если нужно 4 отдельных столбца в выходных данных - конвертировать в datetime только первый столбец, а другой в timedelta s:

df = pd.read_csv('Datetimetest.csv', parse_dates=[0])

m = df['time'].str.count(':') != 1
df['time'] = pd.to_timedelta('00:' + df['time'].mask(m, df['time'].str.replace(':00$', '')))
df['kickoffTime'] = pd.to_timedelta(df['kickoffTime'])
df['eventdatetime'] = df['kickoffDate'] + df['kickoffTime'] + df['time']
print (df.head())
  kickoffDate kickoffTime     time       eventdatetime
0  2018-04-30    19:00:00 00:47:36 2018-04-30 19:47:36
1  2018-04-30    19:00:00 00:15:28 2018-04-30 19:15:28
2  2018-04-29    13:15:00 00:52:03 2018-04-29 14:07:03
3  2018-04-29    13:15:00 01:03:42 2018-04-29 14:18:42
4  2018-04-29    13:15:00 00:10:43 2018-04-29 13:25:43

EDIT:

Если входные данные не csv, для преобразования первого столбца в дату и время можно использовать to_datetime вместо параметра parse_dates в read_csv:

df = pd.read_csv('Datetimetest.csv')

m = df['time'].str.count(':') != 1
df['time'] = pd.to_timedelta('00:' + df['time'].mask(m, df['time'].str.replace(':00$', '')))

df['kickoffDate'] = pd.to_datetime(df['kickoffDate'])
df['kickoffTime'] = pd.to_timedelta(df['kickoffTime'])
df['eventdatetime'] = df['kickoffDate'] + df['kickoffTime'] + df['time']
print (df.head())
  kickoffDate kickoffTime     time       eventdatetime
0  2018-04-30    19:00:00 00:47:36 2018-04-30 19:47:36
1  2018-04-30    19:00:00 00:15:28 2018-04-30 19:15:28
2  2018-04-29    13:15:00 00:52:03 2018-04-29 14:07:03
3  2018-04-29    13:15:00 01:03:42 2018-04-29 14:18:42
4  2018-04-29    13:15:00 00:10:43 2018-04-29 13:25:43
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...