2017-08-06 3 views
1

Ich habe ein Problem mit Python + Numpy + Pandas.datetime64 Fehler beim Hinzufügen zu Pandas DataFrame

Ich habe eine Liste von Zeitstempeln, mit Millisekunde Genauigkeit, als Strings codiert. Dann runde ich sie auf 10ms Auflösung, das geht gut. Der Fehler tritt auf, wenn ich die gerundeten Zeitstempel zu DataFrame als neue Spalte hinzufüge - die Werte von datetime64-Objekten werden vollständig zerstört.

Mache ich etwas falsch? Oder ist das ein Pandas/NumPy Fehler?

BTW, ich habe den Verdacht, dass dieser Fehler nur unter Windows auftritt - ich habe es nicht bemerkt, als ich gestern den gleichen Code auf dem Mac ausprobiert habe (habe das nicht verifiziert).

import numpy 
import pandas as pd 

# We create a list of strings. 
time_str_arr = ['2017-06-30T13:51:15.854', '2017-06-30T13:51:16.250', 
       '2017-06-30T13:51:16.452', '2017-06-30T13:51:16.659'] 
# Then we create a time array, rounded to 10ms (actually floored, 
# not rounded), everything seems to be fine here. 
rounded_time = numpy.array(time_str_arr, dtype="datetime64[10ms]") 
rounded_time 

# Then we create a Pandas DataFrame and assign the time array as a 
# column to it. The datetime64 is destroyed. 
d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']), 
    'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} 
df = pd.DataFrame(d) 
df = df.assign(wrong_time=rounded_time) 
df 

Die Ausgabe erhalte ich:

one two wrong_time 
a 1.0 1.0 1974-10-01 18:11:07.585 
b 2.0 2.0 1974-10-01 18:11:07.625 
c 3.0 3.0 1974-10-01 18:11:07.645 
d NaN 4.0 1974-10-01 18:11:07.665 

Ausgabe von pd.show_versions():

INSTALLED VERSIONS 
commit: None 
python: 3.6.1.final.0 
python-bits: 64 
OS: Windows 
OS-release: 10 
machine: AMD64 
processor: Intel64 Family 6 Model 78 Stepping 3, GenuineIntel 
byteorder: little 
LC_ALL: None 
LANG: None 
LOCALE: None.None 

pandas: 0.20.1 
pytest: 3.0.7 
pip: 9.0.1 
setuptools: 27.2.0 
Cython: 0.25.2 
numpy: 1.12.1 
scipy: 0.19.0 
xarray: None 
IPython: 5.3.0 
sphinx: 1.5.6 
patsy: 0.4.1 
dateutil: 2.6.0 
pytz: 2017.2 
blosc: None 
bottleneck: 1.2.1 
tables: 3.2.2 
numexpr: 2.6.2 
feather: None 
matplotlib: 2.0.2 
openpyxl: 2.4.7 
xlrd: 1.0.0 
xlwt: 1.2.0 
xlsxwriter: 0.9.6 
lxml: 3.7.3 
bs4: 4.6.0 
html5lib: 0.999 
sqlalchemy: 1.1.9 
pymysql: None 
psycopg2: None 
jinja2: 2.9.6 
s3fs: None 
pandas_gbq: None 
pandas_datareader: None 
+0

Sie können 'pd.to_datetime (time_str_arr) ' –

+0

Ich versuchte die pd.to_datetime (time_str_arr). Es hat nichts geändert. Der Fehler konvertiert die Zeichenfolgen nicht in datetime. Dieser Schritt funktioniert gut. Der Fehler besteht darin, dass das datetime64-Array zerstört (oder nicht korrekt importiert) wird, wenn ich versuche, es dem Datumsrahmen hinzuzufügen. –

Antwort

1

Meiner Meinung nach ist es Fehler, weil offensichtlich numpy.datetime64-Timestamp s intern gegossen wird .

Bei mir funktioniert Verwendung to_datetime:

df = df.assign(wrong_time=pd.to_datetime(rounded_time)) 
print (df) 
    one two    wrong_time 
a 1.0 1.0 2017-06-30 13:51:15.850 
b 2.0 2.0 2017-06-30 13:51:16.250 
c 3.0 3.0 2017-06-30 13:51:16.450 
d NaN 4.0 2017-06-30 13:51:16.650 

Eine andere Lösung ns gegossen wird:

df = df.assign(wrong_time=rounded_time.astype('datetime64[ns]')) 
print (df) 
    one two    wrong_time 
a 1.0 1.0 2017-06-30 13:51:15.850 
b 2.0 2.0 2017-06-30 13:51:16.250 
c 3.0 3.0 2017-06-30 13:51:16.450 
d NaN 4.0 2017-06-30 13:51:16.650 
+1

aa, ok - Ich habe die pd.to_datetime() an der falschen Stelle eingefügt. Das funktioniert wirklich, danke! –

0

ich ein Problem in Pandas Git-Repository geöffnet. Und eine vorgeschlagene Lösung von Jeff Reback bekam: Statt seltsam 10ms schaffen datetime64 Objekt, wir einfach um den Zeitstempel Böden() -Funktion:

In [16]: # We create a list of strings. 
...: time_str_arr = ['2017-06-30T13:51:15.854', '2017-06-30T13:51:16.250', 
...:     '2017-06-30T13:51:16.452', '2017-06-30T13:51:16.659'] 

In [17]: pd.to_datetime(time_str_arr).floor('10ms') 
Out[17]: DatetimeIndex(['2017-06-30 13:51:15.850000', '2017-06-30 13:51:16.250000', '2017-06-30 13:51:16.450000', '2017-06-30 13:51:16.650000'], dtype='datetime64[ns]', freq=None) 

Lösung von https://github.com/pandas-dev/pandas/issues/17183

Verwandte Themen