在熊猫中用0(零)填写缺失的日期

时间:2020-01-23 09:38:28

标签: python pandas csv

我有一个大型的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年的日期,结果与以前相同。

3 个答案:

答案 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()