Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python如何修复年份超出范围错误_Python_Python 3.x_Pandas - Fatal编程技术网

Python如何修复年份超出范围错误

Python如何修复年份超出范围错误,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在尝试转换csv文件中的时区,我用于转换的代码工作正常,但由于某种原因,它给了我错误dateutil.parser.\u parser.ParserError:year 20200320超出范围:20200320.0 21:43:00。这很奇怪,因为此代码以前没有发生过此错误 当我尝试用以下代码重现错误时: import pandas as pd #Creating sample dataframe lst1 = [['Bananas', 'Bali', '20200108', '15:3

我正在尝试转换csv文件中的时区,我用于转换的代码工作正常,但由于某种原因,它给了我错误
dateutil.parser.\u parser.ParserError:year 20200320超出范围:20200320.0 21:43:00
。这很奇怪,因为此代码以前没有发生过此错误

当我尝试用以下代码重现错误时:

import pandas as pd

#Creating sample dataframe
lst1 = [['Bananas', 'Bali', '20200108', '15:30:00', 1.58, 1.85, 1.50, 1.50],
['Bananas', 'Bali', '20200108', '22:00:00', 1.68, 1.78, 1.40, 1.60],
['Bananas', 'Bali', '20200109', '15:30:00', 1.88, 1.95, 1.70, 1.86],
['Bananas', 'Bali', '20200109', '22:00:00', 1.78, 1.88, 1.60, 1.65],
['Coconut', 'Bahamas', '20200110', '15:30:00', 2.58, 2.85, 2.50, 2.50],
['Coconut', 'Bahamas', '20200110', '22:00:00', 2.68, 2.78, 2.40, 2.60],
['Coconut', 'Bahamas', '20200111', '15:30:00', 2.88, 2.95, 2.70, 2.86],
['Coconut', 'Bahamas', '20200111', '22:00:00', 2.78, 2.88, 2.60, 2.65]]

df1 = pd.DataFrame(lst1, columns =['Name', 'Origin', 'Date', 'Time', 'Open', 'High', 'Low', 'Close'])
print('Second Dataframe')
print(df1)

df1["Datetime"] = df1["Date"].astype(str) + ' ' + df1["Time"].astype(str)
df1["Datetime"] = pd.to_datetime(df1["Datetime"])
df1["Datetime"] = df1["Datetime"].dt.tz_localize('Europe/Paris').dt.tz_convert('US/Eastern')
df1["Datetime"] = df1["Datetime"].dt.tz_localize(None)
df1["Datetime"] = df1["Datetime"].astype(str)

print(df1)
它不会给我错误,即使它是相同的代码和数据。我对此感到非常困惑,我希望这里有人能帮助我

我试图将日期除以
1000.0
,这是这里的答案,但它给了我一个错误,我不能用字符串进行计算,但我也不能将日期转换为datetime64。我希望这里有人知道如何解决这个问题

编辑: 下面是我正在使用的实际.csv文件的示例。如您所见,它有很多空白,我在脚本中删除了这些空白

Ticker;Exchange;Date;None;Time;Open; High;  Low;    Close;   Volume;   VWAP;      Trades      
AAPL ; NASDAQ ; 20200128; ; 10:00:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 10 ; 0.67 ; 3
AAPL ; NASDAQ ; 20200128; ; 10:01:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 0 ; 0.67 ; 0
AAPL ; NASDAQ ; 20200128; ; 10:02:00 ; 0.66 ; 0.66 ; 0.66 ; 0.66 ; 4 ; 0.66 ; 1
AAPL ; NASDAQ ; 20200128; ; 10:03:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 3 ; 0.67 ; 1
AAPL ; NASDAQ ; 20200128; ; 10:04:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 4 ; 0.67 ; 1
AAPL ; NASDAQ ; 20200128; ; 10:05:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 0 ; 0.67 ; 0
AAPL ; NASDAQ ; 20200128; ; 10:06:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 0 ; 0.67 ; 0
AAPL ; NASDAQ ; 20200128; ; 10:07:00 ; 0.65 ; 0.65 ; 0.65 ; 0.65 ; 4 ; 0.65 ; 1
AAPL ; NASDAQ ; 20200128; ; 10:08:00 ; 0.67 ; 0.67 ; 0.67 ; 0.67 ; 2 ; 0.67 ; 1
AAPL ; NASDAQ ; 20200128; ; 10:09:00 ; 0.7 ; 0.7 ; 0.6422 ; 0.6422 ; 16 ; 0.67157 ; 4
AAPL ; NASDAQ ; 20200128; ; 10:10:00 ; 0.7 ; 0.7 ; 0.7 ; 0.7 ; 1 ; 0.7 ; 1
我为此使用的全部代码:

import pandas as pd
import os

print("Converting Timezone")

TEMP = pd.read_csv("Temp\\data.csv", sep=";")

#Removing Whitespaces
TEMP.rename(columns=lambda x: x.strip(), inplace=True)
TEMP['Ticker'] = TEMP["Ticker"].astype(str).str.strip()
TEMP['Exchange'] = TEMP["Exchange"].astype(str).str.strip()
TEMP['Date'] = TEMP["Date"].astype(str).str.strip()
TEMP['Time'] = TEMP["Time"].astype(str).str.strip()
TEMP['Open'] = TEMP["Open"].astype(str).str.strip()
TEMP['Open'] = TEMP["Open"].astype(float)
TEMP['High'] = TEMP["High"].astype(str).str.strip()
TEMP['High'] = TEMP["High"].astype(float)
TEMP['Low'] = TEMP["Low"].astype(str).str.strip()
TEMP['Low'] = TEMP["Low"].astype(float)
TEMP['Close'] = TEMP["Close"].astype(str).str.strip()
TEMP['Close'] = TEMP["Close"].astype(float)
TEMP['Volume'] = TEMP["Volume"].astype(str).str.strip()
TEMP['Volume'] = TEMP["Volume"].astype(float)
TEMP['VWAP'] = TEMP["VWAP"].astype(str).str.strip()
TEMP['VWAP'] = TEMP["VWAP"].astype(float)
TEMP['Trades'] = TEMP["Trades"].astype(str).str.strip()
TEMP['Trades'] = TEMP["Trades"].astype(float)
TEMP.drop(columns = ['None'], inplace=True)

#converting dates, here is where I get the error (after print(TEMP))
TEMP["Datetime"] = TEMP["Date"].astype(str) + ' ' + TEMP["Time"].astype(str)
print(TEMP)
TEMP["Datetime"] = pd.to_datetime(TEMP["Datetime"])
TEMP["Datetime"] = TEMP["Datetime"].dt.tz_localize('Europe/Paris').dt.tz_convert('US/Eastern')
TEMP["Datetime"] = TEMP["Datetime"].dt.tz_localize(None)
TEMP["Datetime"] = TEMP["Datetime"].astype(str)
new = TEMP["Datetime"].str.split(" ", n=1, expand=True)
TEMP["Date"] = new[0]
TEMP["Time"] = new[1]
TEMP.drop(columns =["Datetime"], inplace = True)
TEMP["Date"] = pd.to_datetime(TEMP["Date"])
TEMP['Date'] = TEMP.Date.dt.strftime('%Y%m%d')
TEMP["Date"] = TEMP["Date"].astype(str)
TEMP.drop_duplicates(subset=['Ticker', 'Exchange', 'Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume', 'VWAP', 'Trades'], keep='first')
TEMP.sort_values(by=['Date', 'Time'])

print("Dataframe")
print(TEMP)
编辑:

好吧,对代码进行以下更改似乎可以解决这个问题,我认为这很奇怪,但我会同意

TEMP["Datetime"] = pd.to_datetime(TEMP["Datetime"], errors='coerce')
errors='concurve'
添加到此行修复了我没有得到错误的问题。然而,这应该为每一个有错误的行返回NaT值,但是我没有得到任何值,所以我的所有数据都会被转换,并且没有发现错误(至少我认为这是这个意思),尽管它之前说它有错误。我很高兴这个问题得到了解决,但仍然对解决方案感到震惊


在这里设置'dtype='object'似乎也有帮助,可能是因为我有一个很大的数据集。

嗯,有很多话要说

首先,
pandas
自动检测每列的类型。使用csv数据,除了作为
int64
导入的列
Date
,所有内容都已正确导入。整个段落称为
#删除空白
,因此没有必要。请注意,如果您保留此段落,代码是100%Functional

也可以在Read TysCSV函数中考虑选项<代码> dType =“对象”<代码>。因此,每列都将设置为

对象
数据

第二,关于你的问题,当我删除第1段并仅运行这批代码时,我确实获得了类型为
datetime64[ns]
Datetime
列:

TEMP=pd.read_csv(文件,sep=“;”)
临时删除(列=['None'],就地=True)
TEMP[“Datetime”]=TEMP[“Date”].astype(str)+''+TEMP[“Time”].astype(str)
TEMP[“Datetime”]=pd.to_Datetime(TEMP[“Datetime”])
打印(临时)
打印(临时数据类型)

您能否共享您的
csv
文件的一些行以查看输入数据?还请包括引起错误的行。谢谢您的回复。我已经用一个示例和整个代码更新了我的帖子。问题是在你的csv文件中没有hypens b/w日期。熊猫支持格式“%Y-%m-%d”。默认情况下数据集没有催眠,还是您对其进行了一些预处理?@amber,谢谢您的评论。我以这种格式获取数据。起初,我尝试将其转换为您建议的格式,但这会导致代码中其他地方出现问题(不同的脚本),因此我认为这样保存比较容易,因为这样做不会导致问题。同样,以前也用过同样的格式,我昨天才收到的错误,尽管我已经用了这样的代码好几天了,谢谢你提供的信息,这确实澄清了一点。在使用了您提供的代码片段之后,我仍然会得到相同的错误。当我按照您的建议将数据类型更改为“object”时,会出现另一个错误:“未知字符串格式:nan-nan”。即使我将我的大型csv文件分割成块,我也会在处理您提供的示例数据时,对每个块都出现此错误。您是否尝试使用较小的csv文件?是的,我将csv文件拆分为4个不同的文件,每个文件都有错误。现在,我尝试了您的“dtype='object''解决方案,并在pd.to_日期时间行中添加了“errors='improve',这似乎可以完成任务。奇怪的是,这个“强制”行应该以NaT的形式返回错误值,但我没有返回任何值,所以我的数据没有问题。我很惊讶这项工作,所以考虑这个问题解决了。我会更新我的帖子并更新你的答案