Pandas 从数据帧日期列中减去一天

Pandas 从数据帧日期列中减去一天,pandas,datetime,type-promotion,Pandas,Datetime,Type Promotion,对不起,我没有熊猫和约会时间的能力。我已经试过了,但有些东西似乎超出了我目前有限的技能范围 我使用的是一个日期列(FinalStartPunch),它被键入datetime64[ns],如果小时为0,则从datetime64[ns]列(日期)中减去一天。如果FinalStartPunch小时不是0,则只需按原样复制日期列值 样本数据: date FinalStartPunch 6/27/2015 27JUN2015:14:15:00 7/23/2015 23JUL2015

对不起,我没有熊猫和约会时间的能力。我已经试过了,但有些东西似乎超出了我目前有限的技能范围

我使用的是一个日期列(FinalStartPunch),它被键入datetime64[ns],如果小时为0,则从datetime64[ns]列(日期)中减去一天。如果FinalStartPunch小时不是0,则只需按原样复制日期列值

样本数据:

date         FinalStartPunch
6/27/2015   27JUN2015:14:15:00
7/23/2015   23JUL2015:13:31:00
7/23/2015   23JUL2015:18:43:00
8/15/2015   15AUG2015:18:35:00
8/15/2015   15AUG2015:23:30:00
8/16/2015   16AUG2015:00:00:00
1/30/2016   30JAN2016:18:25:00
1/30/2016   30JAN2016:23:52:00
1/31/2016   31JAN2016:00:00:00
8/13/2016   13AUG2016:18:30:00
8/13/2016   13AUG2016:23:58:00
8/14/2016   14AUG2016:00:00:00
1/28/2017   28JAN2017:18:30:00
1/28/2017   28JAN2017:23:57:00
1/29/2017   29JAN2017:00:00:00
关键代码部分:

df['New'] = df['date'] - pd.Timedelta(1, unit='D')  ### This one works
print(df.dtypes)

conds = [df['FinalStartPunch'].dt.hour == 0, df['FinalStartPunch'].dt.hour > 0]

choices = [df['date'] - pd.Timedelta(1, unit='D'), df['date']]

df['Date1'] = np.select(conds, choices, default=0)
错误:类型升级无效

df['New']在选项行中使用相同的代码,这似乎是导致错误的问题所在

也许是一个小问题,我需要一个不同的方法来做这件事

任何帮助-非常感谢

df.loc[df['FinalStartPunch'].dt.hour == 0, 'FinalStartPunch'] = df['FinalStartPunch'] - pd.Timedelta(1, unit='D')
您可以使用.loc搜索这些时间,然后减去日期


您可以使用.loc搜索这些时间,然后减去一天。

您可以使用
.dt.hour==0
np.where()
来标识小时为0的行和
-pd.tseries.offset.day()
来减去一天

df['date'] = pd.to_datetime(df['date'])
df['FinalStartPunch'] = pd.to_datetime(df['FinalStartPunch'], format='%d%b%Y:%H:%M:%S')
df['Date1'] = df['FinalStartPunch'].where((df['FinalStartPunch'].dt.hour != 0),
                                                    df['date'] - pd.tseries.offsets.Day())
df
Out[37]: 
         date     FinalStartPunch               Date1
0  2015-06-27 2015-06-27 14:15:00 2015-06-27 14:15:00
1  2015-07-23 2015-07-23 13:31:00 2015-07-23 13:31:00
2  2015-07-23 2015-07-23 18:43:00 2015-07-23 18:43:00
3  2015-08-15 2015-08-15 18:35:00 2015-08-15 18:35:00
4  2015-08-15 2015-08-15 23:30:00 2015-08-15 23:30:00
5  2015-08-16 2015-08-16 00:00:00 2015-08-15 00:00:00
6  2016-01-30 2016-01-30 18:25:00 2016-01-30 18:25:00
7  2016-01-30 2016-01-30 23:52:00 2016-01-30 23:52:00
8  2016-01-31 2016-01-31 00:00:00 2016-01-30 00:00:00
9  2016-08-13 2016-08-13 18:30:00 2016-08-13 18:30:00
10 2016-08-13 2016-08-13 23:58:00 2016-08-13 23:58:00
11 2016-08-14 2016-08-14 00:00:00 2016-08-13 00:00:00
12 2017-01-28 2017-01-28 18:30:00 2017-01-28 18:30:00
13 2017-01-28 2017-01-28 23:57:00 2017-01-28 23:57:00
14 2017-01-29 2017-01-29 00:00:00 2017-01-28 00:00:00

您可以使用
.dt.hour==0
np.where()
来标识小时为0的行和
-pd.tseries.offset.Day()
来减去一天

df['date'] = pd.to_datetime(df['date'])
df['FinalStartPunch'] = pd.to_datetime(df['FinalStartPunch'], format='%d%b%Y:%H:%M:%S')
df['Date1'] = df['FinalStartPunch'].where((df['FinalStartPunch'].dt.hour != 0),
                                                    df['date'] - pd.tseries.offsets.Day())
df
Out[37]: 
         date     FinalStartPunch               Date1
0  2015-06-27 2015-06-27 14:15:00 2015-06-27 14:15:00
1  2015-07-23 2015-07-23 13:31:00 2015-07-23 13:31:00
2  2015-07-23 2015-07-23 18:43:00 2015-07-23 18:43:00
3  2015-08-15 2015-08-15 18:35:00 2015-08-15 18:35:00
4  2015-08-15 2015-08-15 23:30:00 2015-08-15 23:30:00
5  2015-08-16 2015-08-16 00:00:00 2015-08-15 00:00:00
6  2016-01-30 2016-01-30 18:25:00 2016-01-30 18:25:00
7  2016-01-30 2016-01-30 23:52:00 2016-01-30 23:52:00
8  2016-01-31 2016-01-31 00:00:00 2016-01-30 00:00:00
9  2016-08-13 2016-08-13 18:30:00 2016-08-13 18:30:00
10 2016-08-13 2016-08-13 23:58:00 2016-08-13 23:58:00
11 2016-08-14 2016-08-14 00:00:00 2016-08-13 00:00:00
12 2017-01-28 2017-01-28 18:30:00 2017-01-28 18:30:00
13 2017-01-28 2017-01-28 23:57:00 2017-01-28 23:57:00
14 2017-01-29 2017-01-29 00:00:00 2017-01-28 00:00:00

谢谢由于我的沟通能力差,这项工作非常有效,只是做了一点小小的改变。我也想知道的是,为什么另一种方法不起作用。还是要解决这个日期输入难题。很高兴能从有才能的人那里得到答案的帮助。@user2016566,没问题!如果这有助于您解决问题,请接受。关于np.slect,这通常对我有效,但我只在多个条件和结果下使用它。不知道为什么只有一个条件和一个结果不起作用。谢谢。由于我的沟通能力差,这项工作非常有效,只是做了一点小小的改变。我也想知道的是,为什么另一种方法不起作用。还是要解决这个日期输入难题。很高兴能从有才能的人那里得到答案的帮助。@user2016566,没问题!如果这有助于您解决问题,请接受。关于np.slect,这通常对我有效,但我只在多个条件和结果下使用它。不知道为什么只有一个条件和一个结果不起作用。