python - 重新索引并填写缺失的日期

标签 python date pandas dataframe

我有一个采用这种格式的 DataFrame。

       country_txt  multiple  success  nkill  nwound  property      dates  \
1970Q1       Italy         0        1    0.0     0.0         0 1970-01-01   
1970Q1       Italy         0        0    0.0     0.0         1 1970-01-01   
1970Q4       Italy         0        0    0.0     0.0         1 1970-04-01   
1971Q1       Italy         0        1    0.0     0.0         1 1971-01-01   
1971Q3       Italy         0        1    0.0     0.0         1 1971-03-01 

此 DataFrame 的索引是我使用 PeriodIndex 创建的年份和季度。 dates 列也表示年份和季度,月份中的日期无关紧要。我想总结每个季度的所有其他列。通常这不是问题,因为我可以执行 italy.groupby('dates').sum() 操作。但是,我得到的输出是这样的

            multiple  success  nkill  nwound  property  
dates                                                             
1970-01-01         0        1    0.0     0.0         1           
1970-04-01         0        0    0.0     0.0         1           
1971-01-01         0        1    0.0     0.0         1   

现在的问题是我想填充每个未出现的季度的缺失值,因此输出看起来像这样,

                multiple  success  nkill  nwound  property  
dates                                                             
1970-01-01         0        1    0.0     0.0         1 
1970-02-01         0        0    0.0     0.0         0
1970-03-01         0        0    0.0     0.0         0
1970-04-01         0        0    0.0     0.0         1           
1971-01-01         0        1    0.0     0.0         1 

我查阅了之前的问题,发现人们建议我这样做df.reindex(pd.date_range("1970-01-01", "2015-12-31"), fill_value = 0)。问题是这样的,这会给我的数据带来很多额外的行,因为我每天都会有数据,这意味着我必须找到一种方法来重新按季度对数据求和。那么,如果不创造所有这些每日 0 并找到按季度再次总结所有内容的方法,我该如何实现这一目标呢?

作为引用,dates 列的创建方法是首先将原始月份列更改为 1-4 之间的值(表示季度),然后通过执行此操作将其转换为 timedelta 格式

df['dates'] = df.iyear.astype(str).str.cat(df.imonth.astype(str))
df['dates'] = pd.to_datetime(df['dates'], format = '%Y%m')

最佳答案

更新:从字符串索引中解析真实日期。它也应该适用于较旧的 Pandas 版本:

In [212]: df.set_index(pd.to_datetime(df.index)).resample('QS').sum().fillna(0)
Out[212]:
            multiple  success  nkill  nwound  property
idx
1970-01-01       0.0      1.0    0.0     0.0       1.0
1970-04-01       0.0      0.0    0.0     0.0       0.0
1970-07-01       0.0      0.0    0.0     0.0       0.0
1970-10-01       0.0      0.0    0.0     0.0       1.0
1971-01-01       0.0      1.0    0.0     0.0       1.0
1971-04-01       0.0      0.0    0.0     0.0       0.0
1971-07-01       0.0      1.0    0.0     0.0       1.0

旧答案:(假设日期列包含真实日期)。它使用新的 Pandas 0.19.0 功能:.resample(..., on='column_name'):

试试这个:

In [205]: df.resample('QS', on='dates').sum().fillna(0)
Out[205]:
            multiple  success  nkill  nwound  property
dates
1970-01-01       0.0      1.0    0.0     0.0       1.0
1970-04-01       0.0      0.0    0.0     0.0       1.0
1970-07-01       0.0      0.0    0.0     0.0       0.0
1970-10-01       0.0      0.0    0.0     0.0       0.0
1971-01-01       0.0      2.0    0.0     0.0       2.0

或“每月”重新采样:

In [207]: df.resample('QS', on='dates').sum().resample('MS').sum().fillna(0)
Out[207]:
            multiple  success  nkill  nwound  property
dates
1970-01-01       0.0      1.0    0.0     0.0       1.0
1970-02-01       0.0      0.0    0.0     0.0       0.0
1970-03-01       0.0      0.0    0.0     0.0       0.0
1970-04-01       0.0      0.0    0.0     0.0       1.0
1970-05-01       0.0      0.0    0.0     0.0       0.0
1970-06-01       0.0      0.0    0.0     0.0       0.0
1970-07-01       0.0      0.0    0.0     0.0       0.0
1970-08-01       0.0      0.0    0.0     0.0       0.0
1970-09-01       0.0      0.0    0.0     0.0       0.0
1970-10-01       0.0      0.0    0.0     0.0       0.0
1970-11-01       0.0      0.0    0.0     0.0       0.0
1970-12-01       0.0      0.0    0.0     0.0       0.0
1971-01-01       0.0      2.0    0.0     0.0       2.0

关于python - 重新索引并填写缺失的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228505/

相关文章:

java.time.format.DateTimeParseException : Text '2016-2-2' could not be parsed at index 5

javascript - Underscrore 的 now 方法如何更快?

python - 从 Pandas 的一系列线条中制作列

python - P4 python 连接中断 SSL 错误

python - 根据近似或精确匹配合并两个 Pandas DataFrame

r - 按组选择最近日期的行

python - 对列中选定的行进行分组

python - 当Python有GIL时,还需要threading.Lock()吗?

python - 用正则表达式模式替换

python - 删除*几乎*重复的观察 - Python