matplotlib 如何在使用www.example.com _datetime时更改日期pd.to?

k4emjkb1  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(170)

我在使用我创建的数据框架时遇到了一点困难。数据框架是用来记录每天的起床时间、第一餐、最后一餐(这里是第二餐)和睡觉时间(睡眠时间)。
在附件中,您可以看到初始 Dataframe 的样子:

Unnamed: 1  Unnamed: 2  Unnamed: 3  Unnamed: 4  Unnamed: 5
0   2022-09-06  08:03:00    12:09:00    20:19:00    22:35:00
1   2022-09-07  07:30:00    12:20:00    20:35:00    00:10:00
2   2022-09-08  08:30:00    12:15:00    21:30:00    00:33:00
3   2022-09-09  08:56:00    11:00:00    23:00:00    02:00:00

我使用以下命令将列转换为日期时间

test['Date'] = pd.to_datetime(df['Unnamed: 1'])

对于第一列和

test['WakeUp'] = pd.to_datetime(df['Unnamed: 2'], format='%H:%M:%S')

对于其余部分(不能使用与第一列相同的代码行,否则会出现错误),并获得以下内容:

Date    WakeUp  1stMeal 2ndMeal Sleep 
0   2022-09-06  1900-01-01 08:03:00 1900-01-01 12:09:00 1900-01-01 20:19:00 1900-01-01 22:35:00
1   2022-09-07  1900-01-01 07:30:00 1900-01-01 12:20:00 1900-01-01 20:35:00 1900-01-01 00:10:00
2   2022-09-08  1900-01-01 08:30:00 1900-01-01 12:15:00 1900-01-01 21:30:00 1900-01-01 00:33:00
3   2022-09-09  1900-01-01 08:56:00 1900-01-01 11:00:00 1900-01-01 23:00:00 1900-01-01 02:00:00

我的问题是,我希望唤醒,第一餐,第二餐和睡眠的日期与日期列相同,但我没有设法做到这一点。
此外,如果时间超过00:00,我希望更改日期,以便显示第二天而不是同一天(即,我在第1天的7:00起床,但在第2天的2:00睡觉)

我曾试图提取时间并独立使用它们,但没有成功(我不确定如何操纵它们)。
我试着用途:

pd.to_datetime(test['Date'].dt.date) + pd.to_datetime(test['WakeUp'].dt.time)

但没有成功。
我原以为睡眠时间不会因为日期的不同而有那么大的差距...
我在网上找到的所有帮助都是人们使用带有日期和/或时间的 Dataframe ,但作为x轴,而从不作为y轴,这慢慢地让人认为没有解决方案...

gev0vcfq

gev0vcfq1#

您可以在使用to_datetime之前将第一列与另一列连接起来,然后单独转换第一列:

time_cols = df.columns[1:]
df[time_cols] = (df[time_cols].radd(df['Unnamed: 1']+' ', axis=0)
                 .apply(pd.to_datetime)
                 )
df['Unnamed: 1'] = pd.to_datetime(df['Unnamed: 1'])

输出:

Unnamed: 1           Unnamed: 2           Unnamed: 3           Unnamed: 4           Unnamed: 5
0 2022-09-06  2022-09-06 08:03:00  2022-09-06 12:09:00  2022-09-06 20:19:00  2022-09-06 22:35:00
1 2022-09-07  2022-09-07 07:30:00  2022-09-07 12:20:00  2022-09-07 20:35:00  2022-09-07 00:10:00
2 2022-09-08  2022-09-08 08:30:00  2022-09-08 12:15:00  2022-09-08 21:30:00  2022-09-08 00:33:00
3 2022-09-09  2022-09-09 08:56:00  2022-09-09 11:00:00  2022-09-09 23:00:00  2022-09-09 02:00:00
纠正睡眠
df.columns = ['Date', 'WakeUp', '1stMeal', '2ndMeal', 'Sleep']

df['Sleep'] += df['Sleep'].lt(df['WakeUp']).astype(int).mul(pd.DateOffset(days=1))

输出:

Date               WakeUp              1stMeal              2ndMeal               Sleep
0 2022-09-06  2022-09-06 08:03:00  2022-09-06 12:09:00  2022-09-06 20:19:00 2022-09-06 22:35:00
1 2022-09-07  2022-09-07 07:30:00  2022-09-07 12:20:00  2022-09-07 20:35:00 2022-09-08 00:10:00
2 2022-09-08  2022-09-08 08:30:00  2022-09-08 12:15:00  2022-09-08 21:30:00 2022-09-09 00:33:00
3 2022-09-09  2022-09-09 08:56:00  2022-09-09 11:00:00  2022-09-09 23:00:00 2022-09-10 02:00:00
wgx48brx

wgx48brx2#

这个问题的第二部分有点棘手,需要上下文知识来解决。不能保证睡觉时间是第二天。为什么02:00是第二天,而22:00不是?除非你知道没有人会保持那么长时间的清醒,否则没有办法判断。一个实用的方法是检查一个合理的时间(比如10:00),如果睡觉时间在这个时间之前,你可以使用https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.tseries.offsets.DateOffset.html在日期上加上一天

timestamp = timestamp + DateOffset(day=1)

相关问题