Подтвердить что ты не робот

Pandas преобразование строки с временной отметкой unix (в миллисекундах) в datetime

Мне нужно обработать огромное количество CSV файлов, где метка времени всегда является строкой, представляющей временную метку unix в миллисекундах. Я не смог найти способ, чтобы эффективно редактировать эти столбцы.

Это то, что я придумал, однако это, конечно, дублирует только столбец, и мне нужно как-то вернуть его в исходный набор данных. Я уверен, что это можно сделать при создании DataFrame?

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO
import pandas as pd

data = 'RUN,UNIXTIME,VALUE\n1,1447160702320,10\n2,1447160702364,20\n3,1447160722364,42'

df = pd.read_csv(StringIO(data))

convert = lambda x: datetime.datetime.fromtimestamp(x / 1e3)
converted_df = df['UNIXTIME'].apply(convert)

Это выберет столбец "UNIXTIME" и изменит его из

0    1447160702320
1    1447160702364
2    1447160722364
Name: UNIXTIME, dtype: int64

в этот

0   2015-11-10 14:05:02.320
1   2015-11-10 14:05:02.364
2   2015-11-10 14:05:22.364
Name: UNIXTIME, dtype: datetime64[ns]

Однако, я хотел бы использовать что-то вроде pd.apply(), чтобы получить весь набор данных, возвращенный с преобразованным столбцом, или, как я уже писал, просто создавайте datetime при создании DataFrame из CSV.

4b9b3361

Ответ 1

Вы можете сделать это как шаг последующей обработки, используя to_datetime и передав arg unit='ms':

In [5]:
df['UNIXTIME'] = pd.to_datetime(df['UNIXTIME'], unit='ms')
df

Out[5]:
   RUN                UNIXTIME  VALUE
0    1 2015-11-10 13:05:02.320     10
1    2 2015-11-10 13:05:02.364     20
2    3 2015-11-10 13:05:22.364     42

Ответ 2

Я использую решение @EdChum, но я добавляю управление часовым поясом:

df['UNIXTIME']=pd.DatetimeIndex(pd.to_datetime(pd['UNIXTIME'], unit='ms'))\
                 .tz_localize('UTC' )\
                 .tz_convert('America/New_York')

tz_localize указывает, что временную метку следует рассматривать как относящуюся к "UTC", тогда tz_convert фактически перемещает дату/время в правильный часовой пояс (в данном случае "Америка/Нью_York" ).

Обратите внимание, что он был преобразован в DatetimeIndex, потому что методы tz_ работают только по индексу серии. Так как Pandas 0,15 можно использовать .dt:

df['UNIXTIME']=pd.to_datetime(pd['UNIXTIME'], unit='ms')\
                 .dt.tz_localize('UTC' )\
                 .dt.tz_convert('America/New_York')

Ответ 3

Я придумал решение, которое я предполагаю:

convert = lambda x: datetime.datetime.fromtimestamp(float(x) / 1e3)

df = pd.read_csv(StringIO(data), parse_dates=['UNIXTIME'], date_parser=convert)

Я все еще не уверен, что это лучший вариант.

Ответ 4

если вы знаете единицу времени, используйте Series.astype:

df['UNIXTIME'].astype('datetime64[ms]')

0   2015-11-10 13:05:02.320
1   2015-11-10 13:05:02.364
2   2015-11-10 13:05:22.364
Name: UNIXTIME, dtype: datetime64[ns]

Чтобы вернуть весь DataFrame, используйте

df.astype({'UNIXTIME': 'datetime64[ms]'})

   RUN                UNIXTIME  VALUE
0    1 2015-11-10 13:05:02.320     10
1    2 2015-11-10 13:05:02.364     20
2    3 2015-11-10 13:05:22.364     42

Ответ 5

Как я могу преобразовать этот фрейм данных в метку времени Unix для каждой строки?

Есть кто-то, кто может помочь нам, пожалуйста?

DataFrame/Dataset