Конвертировать столбцы даты / времени в панде
У меня есть наборы данных, содержащие дату (юлианский день, столбец 1), часы (ЧЧММ, столбец 2) и секунды (столбец 3) в отдельных столбцах:
1 253 2300 0 2.9 114.4 18.42 21.17
1 253 2300 10 3.27 111.2 18.48 21.12
1 253 2300 20 3.22 111.3 18.49 21.09
1 253 2300 30 3.84 106.4 18.52 21
1 253 2300 40 3.75 104.4 18.53 20.85
Я читаю текстовый файл, используя Pandas
как:
columns = ['station','julian_day','hours','seconds','U','Ud','T','RH']
df = pd.read_table(file_name, header=None, names=columns, delim_whitespace=True)
Теперь я хочу преобразовать дату во что-то более удобное, например YYYY-MM-DD HH:MM:SS
(Год не указан в наборе данных, но зафиксирован в 2001 году).
Я попытался объединить три столбца в один, используя parse_dates
:
df = pd.read_table(file_name, header=None, names=columns, delim_whitespace=True,
parse_dates={'datetime' : ['julian_day','hours','seconds']})
который преобразует три столбца в одну строку:
In [38]: df['datetime'][0]
Out[38]: '253 2300 0'
Затем я попытался преобразовать их, используя date_parser
; после этого поста, используя что-то вроде:
date_parser = lambda x: datetime.datetime.strptime(x, '%j %H%M %s')
date_parser
само по себе работает, но я не могу заставить это сочетаться с read_table
и я в значительной степени застрял на этом этапе. Есть ли простой способ добиться конверсии?
Полный минимальный (не очень) рабочий пример:
import pandas as pd
import datetime
from io import StringIO
data_file = StringIO("""\
1 253 2300 0 2.9 114.4 18.42 21.17
1 253 2300 10 3.27 111.2 18.48 21.12
1 253 2300 20 3.22 111.3 18.49 21.09
1 253 2300 30 3.84 106.4 18.52 21
1 253 2300 40 3.75 104.4 18.53 20.85
""")
date_parser = lambda x: datetime.datetime.strptime(x, '%j %H%M %S')
columns = ['station','julian_day','hours','seconds','U','Ud','T','RH']
df = pd.read_table(data_file, header=None, names=columns, delim_whitespace=True,\
parse_dates={'datetime' : ['julian_day','hours','seconds']})
2 ответа
Не уверен, что я что-то упустил, но это похоже на работу:
import pandas as pd
import datetime
from io import StringIO
data_file = StringIO("""\
1 253 2300 0 2.9 114.4 18.42 21.17
1 253 2300 10 3.27 111.2 18.48 21.12
1 253 2300 20 3.22 111.3 18.49 21.09
1 253 2300 30 3.84 106.4 18.52 21
1 253 2300 40 3.75 104.4 18.53 20.85
""")
date_parser = lambda x: datetime.datetime.strptime(("2001 " + x), '%Y %j %H%M %S')
columns = ['station','julian_day','hours','seconds','U','Ud','T','RH']
df = pd.read_table(data_file, header=None, names=columns, delim_whitespace=True,\
date_parser = date_parser,parse_dates={'datetime' : ['julian_day','hours','seconds']})
Я просто добавляю параметр date_parser в read_table и hard codded 2001 в функцию синтаксического анализа.
Будет ли что-то в этом направлении работать?:
def merge_date(df, year='Year', month='Month', day='Day', hours='Hours', seconds='Seconds'):
"""
* Function: merge_date
* Usage: merge_date(DataFrame, col_year, col_month, col_day) . . .
* -------------------------------
* This function returns Datetime in the format YYYY-MM-DD from
* input of a dataframe with columns holding 'Year', 'Month', 'Day'
"""
df['DateTime'] = df[[year, month, day, hours, seconds]].apply(lambda s : datetime.datetime(*s),axis = 1)
return df
использование datetime.datetime
с распаковкой аргументов для каждого столбца данных