#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
. Я обновил свой ответ, чтобы лучше понять.