Ошибка типа: не удается преобразовать серию в в to_date

#python-3.x #pandas #dataframe

Вопрос:

Как говорится в ошибке

 Traceback (most recent call last):
  File "E:fakepathpythonCSVmain.py", line 84, in <module>
    print(to_date(df['start_time']))
  File "E:fakepathpythonCSVmain.py", line 75, in to_date
    return datetime.strftime(datetime.fromtimestamp(int(x)/1000).strftime("%d-%b-%Y"), "%d-%b-%Y")
  File "C:Users%username%AppDataLocalProgramsPythonPython39libsite-packagespandascoreseries.py", line 141, in wrapper
    raise TypeError(f"cannot convert the series to {converter}")
TypeError: cannot convert the series to <class 'int'>
 

И мой код таков:

 import pandas as pd
import glob
from datetime import datetime, timedelta
from pymongo import MongoClient

client = MongoClient()
col = client['right']['abcde']

listFileNames = (glob.glob(r"C:Users%username%DesktopBook1.csv"))

# print(len(listFileNames))

cols = ["start_time", "end_time", "source_Ip", "source_Mac", "destination_Ip", "destination_Mac"]


def get_merged_data_frame(list_file_names, p_index_col=False, p_header=None, columns=None):
    if columns is None:
        columns = cols
    if len(list_file_names) == 1:
        return pd.read_csv(list_file_names[0], index_col=p_index_col, header=p_header, low_memory=False,
                           names=columns,
                           usecols=[6, 7, 8, 9, 10, 11])
    else:
        df_from_each_file = (pd.read_csv(f, index_col=p_index_col, header=p_header, low_memory=False, names=columns,
                                         usecols=[6, 7, 8, 9, 10, 11])
                             for f in list_file_names)
        concatenated_df = pd.concat(df_from_each_file, ignore_index=True)
        return concatenated_df


def to_date(x):
    return datetime.strftime(datetime.fromtimestamp(int(x)/1000).strftime("%d-%b-%Y"), "%d-%b-%Y")




df = get_merged_data_frame(listFileNames)
print(df)
df['start_data'] = df['start_time'].apply(to_date)
print(to_date(df['start_time']))
print(type(df))
print(df)
data = df.to_dict(orient='records')
print(data)
col.insert_many(data)
 

Я перепробовал много решений, я пробовал, но я не знаю, куда я положил, правильно ли это?
Многие решения говорят об использовании .astype(int) или .astype(float)

 df['start_data'] = df['start_time'].astype(int)
 

Это df['start_time'] выглядит так

 0       1617213592022005000
1       1617213592064079000  
Name: start_time, Length: 3960, dtype: int64
 

Но, похоже, это неправильно…

Спасибо за любые ответы…

Комментарии:

1. На что df['start_time'] это похоже? [1622332800000.0, 1622347200000.0, 1622361600000.0, ...] ?

2. для этого я отредактировал вопрос. пожалуйста, взгляните

3. df['start_time']=pd.to_datetime(df['start_time'])

4. нашел что-нибудь??

Ответ №1:

Вы можете попробовать использовать строковое представление (например, вашу функцию to_date ).

 df['start_data'] = pd.to_datetime(df['start_time'], unit='ns') 
                     .dt.strftime("%d-%b-%Y")
 
 >>> df
            start_time   start_data
0  1617213592022005000  31-Mar-2021
1  1617213592064079000  31-Mar-2021
 

Комментарии:

1. Спасибо, но теперь я получаю эту ошибку ValueError: invalid literal for int() with base 10: '31-Mar-2021'

2. Какова строка кода, которая вызывает это исключение?

3. В этой строке ошибка возрастает после изменения df['start_data'] = pd.to_datetime(df['start_time'], unit='ns').dt.strftime("%d-%b-%Y").astype(int).apply(to_date)

4. Вам больше не нужна .astype(int).apply(to_date) и ваша функция to_date . Я обновил свой ответ, чтобы лучше понять.