我有一个大型的csv文件,其中包含数百万行。数据看起来像这样。 2列(日期,得分)和百万行。我需要缺少日期(例如1/1 / 16、2 / 1 / 16、4 / 1/16),以便在“得分”列中具有“ 0”值,并保持现有的“日期”和“得分”不变,全部在同一csv中。但是,我在许多约会中都有多个(可能数百个)分数。所以真的很难编写代码。在stackoverflow上查找了很多示例,但似乎都没有用。
date score
3/1/16 0.6369
5/1/16 -0.2023
6/1/16 0.25
7/1/16 0.0772
9/1/16 -0.4215
12/1/16 0.296
15/1/16 0.25
15/1/16 0.7684
15/1/16 0.8537
...
...
31/12/18 0.5646
这是我到目前为止所做的。但是我得到的只是一个索引栏,其中填充了3年的“日期”,而“得分”列则填充了“ 0”。非常感谢您的回答和建议。非常感谢。
import csv
import pandas as pd
import datetime as dt
df =pd.read_csv('myfile.csv')
dtr =pd.date_range('01.01.2016', '31.12.2018')
df.index = pd.DatetimeIndex(df.index)
df =df.reindex(dtr,fill_value = 0)
df.to_csv('missingDateCorrected.csv', encoding ='utf-8', index =True)
注意:我知道我将index设置为True,这就是为什么出现索引但不知道为什么'date'列未填充的原因。如果将parse_dates =['date']
放在pd.read_csv
中,则会得到'date'列,其中填充了1970年的日期,结果与以前相同。
答案 0 :(得分:1)
您可以这样做:
(我这样做的时间范围较小,因此请更改日期以使其适合您。)
import pandas as pd
x = {"date":["3/1/16","5/1/16","5/1/16"],
"score":[4,5,6]}
df = pd.DataFrame.from_dict(x)
df["date"] = pd.to_datetime(df["date"], format='%d/%m/%y')
df.set_index("date",inplace=True)
dtr =pd.date_range('01.01.2016', '01.10.2016', freq='D')
s = pd.Series(index=dtr)
df = pd.concat([df,s[~s.index.isin(df.index)]]).sort_index()
df = df.drop([0],axis=1).fillna(0)
print(df)
score
2016-01-01 0.0
2016-01-02 0.0
2016-01-03 4.0
2016-01-04 0.0
2016-01-05 5.0
2016-01-05 6.0
2016-01-06 0.0
2016-01-07 0.0
2016-01-08 0.0
2016-01-09 0.0
2016-01-10 0.0
因为您在此处的注释中询问一个带有文件的示例:
df = pd.read_csv('myfile.csv', index_col=0)
df.index = pd.to_datetime(df.index, format='%d/%m/%y')
dtr =pd.date_range('01.01.2016', '01.10.2016', freq='D')
s = pd.Series(index=dtr)
df = pd.concat([df,s[~s.index.isin(df.index)]]).sort_index()
df = df.drop([0],axis=1).fillna(0)
df.to_csv('missingDateCorrected.csv', encoding ='utf-8', index =True)
答案 1 :(得分:1)
效率不高,但是可以使用。
import pandas as pd
df = pd.read_csv('myfile.csv', index_col=0)
df.index = pd.to_datetime(df.index, format='%d/%m/%y')
dtr = pd.date_range('01.01.2016', '31.12.2018')
# Create an empty DataFrame from selected date range
empty = pd.DataFrame(index=dtr, columns=['score'])
# Append your CSV file
df = pd.concat([df, empty[~empty.index.isin(df.index)]]).sort_index().fillna(0)
df.to_csv('missingDateCorrected.csv', encoding='utf-8', index=True)
答案 2 :(得分:0)
只是个主意。尝试用1天的时间重新采样并填充零。 例如:nd = df.resample('D')。pad()