我的Date列值为2020-6-10、2020-6-9,依此类推。如果月份或日期中的数字小于10,则需要添加零。 我尝试了以下代码,但出现错误。有人可以告诉我我得到了吗?有没有更好的方法。我需要更改“日期”列中的值。
for x in df['Date']:
y,m,d = x.split('-')
m = m.zfill(2)
d = d.zfill(2)
x = y + "-" + m + "-" + d
错误=值不足以解压(预期3,得到1)
答案 0 :(得分:1)
此错误是指split函数没有给您期望的三个值;年,月和日。如果您输入的x值不是您期望的值,那么将无济于事。
我怀疑您列中的值之一不具有您期望的y-m-d格式。或更准确地说,它的值少于3个,用“-”
分隔尝试将split函数换行,并打印出该值以查看x
的值是什么。
try:
y,m,d = x.split('-')
except ValueError:
print(“This input does not split: %s”, x)
一旦我们确定了输入内容,便可以提出一种获取所需输出的方法。
答案 1 :(得分:1)
当您尝试在第二行拆分字符串输入时,发生错误。 可以很容易地以这种方式复制它:
>>> y,m,d='aaaaaa'.split('-')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)
您将需要添加一个try-catch块来捕获那些不代表有效日期的输入。例如:
>>> try:
... y,m,d='aaaaaa'.split('-')
... except ValueError:
... return ''
您还可以在调用这些语句之前对Pandas数据框进行一些预处理:
>>> df.dropna(subset=['Date'], inplace=True)
您还可以使用占位符填充缺少的值:
>>> df['Date'].replace('', '01-01-2020', inplace=True)
答案 2 :(得分:0)
其他答案说明了错误的来源-这是另一个选择,如何使用仅允许使用特定格式的字符串的正则表达式来“清理” df:
import pandas as pd
# example df with invalid strings in Date col:
df = pd.DataFrame({'Date': ['2020-6-10','2020-6-9','','rubbish']})
# filter df to contain valid dates only
df = df[df['Date'].str.contains('[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}')]
# df
# Date
# 0 2020-6-10
# 1 2020-6-9
# now change date format using strftime:
df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%Y-%m-%d')
# df['Date']
# 0 2020-06-10
# 1 2020-06-09
# Name: Date, dtype: object