функция для date_parser и read_csv не работает - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть 3 разных набора данных, которые я читаю с помощью pd.read_csv. Один из столбцов данных - это время в секундах, и я хотел бы использовать функцию, которую я сделал для аргумента pd.read_csv date_parser. Работает нормально, когда все данные целые. Однако, функция, которую я сделал, не работает, когда у меня есть строка или число с плавающей точкой. Я думаю, что проблема происходит в datetime.datetime.fromtimestamp (float (time_in_secs) часть моей функции. Кто-нибудь знает, как я могу заставить это работать для всех моих наборов данных. Я полностью застрял. Ниже приведен пример того, как выглядят 3 разных набора данных.

набор данных 1

555, 1404803485, 800

555, 1408906759, 900

набор данных 2

231, 1404803485, пропуск

231, 1404803490, сбой

набор данных 3

16010925, 1403890894, 40,5819880696

16010925, 1903929273, 40,5819880696

def dateparse(time_in_secs):

if isinstance(time_in_secs, str):
    if time_in_secs == '\\N':
        time_in_secs = 0

tm = datetime.datetime.fromtimestamp(float(time_in_secs))
tm = tm - datetime.timedelta(
    minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond)
return tm


pd.read_csv('dataset_here.csv',
           delimiter=',', index_col=[0,1], parse_dates=['Timestamp'], 
                date_parser=dateparse, names=['Serial', 'Timestamp', 'result'])

1 Ответ

0 голосов
/ 06 сентября 2018

Я считаю, что нужно преобразовать время в 0 для всех строк, для float s ваше решение работает хорошо:

def dateparse(time_in_secs):

    if isinstance(time_in_secs, str):
        #https://stackoverflow.com/a/45372194
        #time_in_secs = 86400
        time_in_secs = 0

    #print (time_in_secs)
    tm = datetime.datetime.fromtimestamp(float(time_in_secs))
    tm = tm - datetime.timedelta(
    minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond)
    return tm

Более общее решение - попробуйте преобразовать значение в число с плавающей запятой и, если это невозможно, назначьте значение по умолчанию:

def dateparse(time_in_secs):

    if isinstance(time_in_secs, str):
        try:
            time_in_secs = float(time_in_secs)
        except ValueError:
            #https://stackoverflow.com/a/45372194
            #time_in_secs = 86400
            time_in_secs = 0

    #print (time_in_secs)
    tm = datetime.datetime.fromtimestamp(float(time_in_secs))
    tm = tm - datetime.timedelta(
    minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond)
    return tm

Образец : протестировано под Windows:

import pandas as pd
import datetime

def dateparse(time_in_secs):

    if isinstance(time_in_secs, str):
        try:
            time_in_secs = float(time_in_secs)
        except ValueError:
            #https://stackoverflow.com/a/45372194
            #time_in_secs = 0
            time_in_secs = 86400

    print (time_in_secs)
    tm = datetime.datetime.fromtimestamp(float(time_in_secs))
    tm = tm - datetime.timedelta(
    minutes=tm.minute % 10, seconds=tm.second, microseconds=tm.microsecond)
    return tm

temp=u"""16010925,test,40.5819880696
16010925,1903929273,40.5819880696"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), index_col=[0,1], parse_dates=['Timestamp'], 
                date_parser=dateparse, names=['Serial', 'Timestamp', 'result'])

print (df)
                                 result
Serial   Timestamp                     
16010925 1970-01-02 01:00:00  40.581988
         2030-05-02 07:10:00  40.581988

print (df.index.get_level_values(1))
DatetimeIndex(['1970-01-02 01:00:00', '2030-05-02 07:10:00'], 
              dtype='datetime64[ns]', name='Timestamp', freq=None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...