Pandas - 每天至少添加一行(日期时间包括时间)

问题描述 投票:0回答:2

编辑:如果您的日期不包含时间,您可以将所谓的重复解决方案

reindex()
一起使用,否则您需要像@kosnik那样的解决方案。此外,他们的解决方案不需要你的日期作为索引!

我的数据格式如下

df = pd.DataFrame(data=[['2017-02-12 20:25:00', 'Sam', '8'],
                        ['2017-02-15 16:33:00', 'Scott', '10'],
                        ['2017-02-15 16:45:00', 'Steve', '5']],
                  columns=['Datetime', 'Sender', 'Count'])
df['Datetime'] = pd.to_datetime(df['Datetime'], format='%Y-%m-%d %H:%M:%S')

              Datetime Sender Count
0  2017-02-12 20:25:00    Sam     8
1  2017-02-15 16:33:00  Scott    10
2  2017-02-15 16:45:00  Steve     5

我需要每个日期至少有一行,所以预期的结果是

              Datetime  Sender Count
0  2017-02-12 20:25:00    Sam      8
1  2017-02-13 00:00:00   None      0
2  2017-02-14 00:00:00   None      0
3  2017-02-15 16:33:00  Scott     10
4  2017-02-15 16:45:00  Steve      5

我尝试将日期时间作为索引,添加日期并像这样使用

reindex()

df.index = df['Datetime']
values = df['Datetime'].tolist()
for i in range(len(values)-1):
    if values[i].date() + timedelta < values[i+1].date():
        values.insert(i+1, pd.Timestamp(values[i].date() + timedelta))
print(df.reindex(values, fill_value=0))

这使得每一行都会忘记其他列,并且

asfreq('D')
resample()

也会发生同样的事情
                    ID Sender Count
Datetime
2017-02-12 16:25:00  0    Sam     8
2017-02-13 00:00:00  0      0     0
2017-02-14 00:00:00  0      0     0
2017-02-15 20:25:00  0      0     0
2017-02-15 20:25:00  0      0     0

解决这个问题的适当方法是什么?

python pandas
2个回答
2
投票

我将创建一个新的

DataFrame
列,其中包含所有必需的数据,然后与您的数据框左连接。

工作代码示例如下

df['Datetime'] = pd.to_datetime(df['Datetime']) # first convert to datetimes
datetimes = df['Datetime'].tolist() # these are existing datetimes - will add here the missing
dates = [x.date() for x in datetimes] # these are converted to dates

min_date = min(dates)
max_date = max(dates)
for d in range((max_date - min_date).days):
    forward_date = min_date + datetime.timedelta(d)
    if forward_date not in dates:
        datetimes.append(np.datetime64(forward_date))

# create new dataframe, merge and fill 'Count' column with zeroes
df = pd.DataFrame({'Datetime': datetimes}).merge(df, on='Datetime', how='left')
df['Count'].fillna(0, inplace=True)

0
投票
col1=df.Datetime.dt.date.map(pd.to_datetime)
col2=col1.duplicated()
dd1=df.assign(col1=col1).loc[~col2].resample('D',on='col1').agg('first').reset_index()
pd.concat([dd1,df.loc[col2]]).sql.select('coalesce(Datetime,col1) Datetime,Sender,coalesce(Count,0) Count').df()


              Datetime  Sender Count
0  2017-02-12 20:25:00    Sam      8
1  2017-02-13 00:00:00   None      0
2  2017-02-14 00:00:00   None      0
3  2017-02-15 16:33:00  Scott     10
4  2017-02-15 16:45:00  Steve      5
© www.soinside.com 2019 - 2024. All rights reserved.