2017-02-14 2 views
0

j'ai les données suivantes (en fait des AirPassengers de http://vincentarelbundock.github.io/Rdatasets/datasets.html)Parsing Dates de Float en 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 

Comment analyser la colonne de temps en Python à une date (TS) et non un flotteur. J'ai besoin cela comme une étape de base avant de commencer la prévision des séries chronologiques

Sur la base des commentaires Le temps est au cours des années et est un flotteur (1949,000 Jan 1949 et 1949,0833 est février 1949)

J'utilise cette fonctionnalité pour importer données, je ne sais pas comment utiliser l'analyseur de dates dans les 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-

une possible Solution- ignorer la valeur de flotteur et créer une série chronologique de date en utilisant début, la fin et l'intervalle de temps

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 

Notez le nouveau de problèmes montre jour de fin de mois (commençant) et notre problème initial de transformer les valeurs flottantes en valeurs datetime restent

Python Version

!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

Quel format est-ce? –

+0

Quelle heure est censée représenter 1949.0? 1,949 secondes après l'époque Unix? Le 19ème jour de l'année '49? 19 heures et 49 minutes après minuit? Nous n'avons aucun moyen de savoir. – Kevin

+0

À quelle unité l'heure est-elle exprimée? Du lien, on dirait que c'est 1949 comme année? Pouvez-vous donner un exemple du format attendu? –

Répondre

1

Il ressemble à votre les données d'entrée ne sont pas très précises. Il est juste:

1949 + float(month)/12 

Vous pouvez simplement parcourir vos numéros de ligne:

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

Il produit:

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 

Si vous voulez vraiment analyser les chaînes, vous pouvez essayer:

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 

De cette façon, le étapes entre les points de données sera exactement un 1/12ème d'une année.

+0

Je reçois ce TypeError: argument entier attendu, got float –

+0

Quelle version de Python utilisez-vous? –

1

Je suppose,

1949.000 = 1st jan 1949 

et

1949.9999... = 31th dec 1949 

En outre, comme Eric Duminil a souligné, vos valeurs semblent être un mois arrondi. Si cela est vrai, alors vous pouvez faire quelque chose comme ceci:

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