2017-02-14 21 views
0

У меня есть следующие данные (на самом деле AirPassengers из http://vincentarelbundock.github.io/Rdatasets/datasets.html)Разбор Даты из Float в Python

 time    AirPassengers 
1 1949.000000   112 
2 1949.083333   118 
3 1949.166667   132 
4 1949.250000   129 
5 1949.333333   121 
6 1949.416667   135 

Как разобрать колонку времени в Python, чтобы быть датой (TS), а не с плавающей точкой. Мне это нужно как основной шаг, прежде чем начать прогнозируемое время серию

На основе замечаний Время в годах и является поплавок (1949,000 является Ян 1949 и 1949,0833 является февраль 1949)

Я использую это импорт данные, я не знаю, как использовать дату парсер в read_csv

series = read_csv('http://vincentarelbundock.github.io/Rdatasets/csv/datasets/AirPassengers.csv', header=0, parse_dates=[0], index_col=0, squeeze=True,) 

Updated-

один можно решение- игнорировать значение с плавающей точкой и создать временную дату серии, используя начало, конец и временной интервал

series['dates']=pd.date_range('1949-01', '1961-01', freq='M') 
series.head() 

time AirPassengers dates 
1 1949.000000 112 1949-01-31 
2 1949.083333 118 1949-02-28 
3 1949.166667 132 1949-03-31 
4 1949.250000 129 1949-04-30 
5 1949.333333 121 1949-05-31 
In [45]: 

series.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 144 entries, 1 to 144 
Data columns (total 3 columns): 
time    144 non-null float64 
AirPassengers 144 non-null int64 
dates   144 non-null datetime64[ns] 
dtypes: datetime64[ns](1), float64(1), int64(1) 
memory usage: 4.5 KB 

Обратите внимание на новых проблемно показывает конечный день месяца (не начиная) и нашу исходную задачу превращения значений с плавающей запятой в DateTime значения остаются

Python версии

!pip install version_information 
%load_ext version_information 
%version_information 


Software Version 
Python 3.5.2 64bit [MSC v.1900 64 bit (AMD64)] 
IPython 5.1.0 
OS Windows 7 6.1.7600 SP0 
+0

Какой формат это? –

+0

Сколько месяцев должен находиться 1949,0? 1,949 секунд после эпохи Unix? 19-й день года? 19 часов и 49 минут после полуночи? Мы не знаем. – Kevin

+0

На какой единице время? Из ссылки было бы похоже, что это 1949 год? Можете ли вы привести пример ожидаемого формата? –

ответ

1

Похоже, ваши входные данные не очень точны. Это просто:

1949 + float(month)/12 

Вы можете просто перебирать свои номера строк:

import datetime 
start_year = 1949 
for line_number in range(20): 
    print datetime.date(start_year + line_number/12, line_number % 12 + 1 , 1) 

Он выводит:

1949-01-01 
1949-02-01 
1949-03-01 
1949-04-01 
1949-05-01 
1949-06-01 
1949-07-01 
1949-08-01 
1949-09-01 
1949-10-01 
1949-11-01 
1949-12-01 
1950-01-01 
1950-02-01 
1950-03-01 
1950-04-01 
1950-05-01 
1950-06-01 
1950-07-01 
1950-08-01 

Если вы действительно хотите, чтобы разобрать строки, вы можете попробовать:

import datetime 

year_str = "1949.166667" 
year_float = float(year_str) 
year = int(year_float) 
year_start = datetime.date(year,1,1) 
delta = datetime.timedelta(days = int((year_float-year)*365)) 

print year_start + delta 
# 1949-03-02 

Таким образом, шаги между точками данных будут составлять ровно 1/12 года.

+0

Я получаю этот TypeError: целочисленный аргумент, ожидаемый, получил float –

+0

Какую версию Python вы используете? –

1

Я полагаю,

1949.000 = 1st jan 1949 

и

1949.9999... = 31th dec 1949 

Кроме того, как Эрик Duminil отметил, ваши ценности, кажется, месяц округлены. Если это правда, вы можете сделать что-то вроде этого:

import datetime 
from dateutil.relativedelta import relativedelta 

def floatToDate(date_as_float): 
    year = int(date_as_float) 
    months_offset = round((date_as_float - float(year)) * 12.0, 0) 
    new_date = datetime.datetime(year,01,01,0,0,0,0) 
    new_date = new_date + relativedelta(months=int(months_offset)) 
    return new_date 

converted = floatToDate(1949.083333) # datetime 01-feb-1949