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.
Ответы
Ответ 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