Python 如何更改数据帧列中时间戳的日期而不是时间?

Python 如何更改数据帧列中时间戳的日期而不是时间?,python,pandas,datetime,timestamp,Python,Pandas,Datetime,Timestamp,Python 3.6.0 我正在导入带有Unix时间戳的文件。 我将它们转换为熊猫日期时间,并四舍五入到10分钟(12:00、12:10、12:20,…) 数据是在指定的时间段内收集的,但来自不同的日期。 对于我们的分析,我们希望在重新采样之前将所有日期更改为相同的日期 目前,我们有一个reduce_to_date,这是所有日期的目标 current_date = pd.to_datetime('2017-04-05') #This will later be dynamic reduce_t

Python 3.6.0

我正在导入带有Unix时间戳的文件。
我将它们转换为熊猫日期时间,并四舍五入到10分钟(12:00、12:10、12:20,…)

数据是在指定的时间段内收集的,但来自不同的日期。
对于我们的分析,我们希望在重新采样之前将所有日期更改为相同的日期

目前,我们有一个
reduce_to_date
,这是所有日期的目标

current_date = pd.to_datetime('2017-04-05')  #This will later be dynamic
reduce_to_date = current_date - pd.DateOffset(days=7)
我试图找到一种简单的方法,在不更改时间的情况下更改系列中的日期。
我试图通过
.strftime()
避免冗长的转换

我几乎已经解决的一个方法是将
reduce\u添加到日期
df['Timestamp']
差异添加到
df['Timestamp']
。但是,我尝试使用
.date()
函数,该函数只对单个元素有效,而对系列不起作用

好!

passed_df['Timestamp'][0] = passed_df['Timestamp'][0] + (reduce_to_date.date() - passed_df['Timestamp'][0].date())
不好

passed_df['Timestamp'][:] = passed_df['Timestamp'][:] + (reduce_to_date.date() - passed_df['Timestamp'][:].date())
AttributeError:“Series”对象没有属性“date”

我可以使用循环:

x=1
for line in passed_df['Timestamp']:
    passed_df['Timestamp'][x] = line + (reduce_to_date.date() - line.date())
    x+=1
但这发出了一个警告:

C:\Users\elx65i5\Documents\Lightweight Logging\newmain.py:60:SettingWithCopyWarning: 试图在数据帧切片的副本上设置值 请参阅文档中的注意事项:

目标是使所有日期都相同,但保留原始时间。
如果我们可以简单地指定更换日期,那就太好了。
如果我们能运用数学,根据时间差来改变每个日期,同样伟大。

我们可以不使用.strftime()或冗长的过程,以矢量化的方式完成这项工作吗

我认为您需要转换
df['Timestamp'].dt.date
,因为python日期对象的输出是
python日期对象
,而不是
pandatetime对象

df=pd.DataFrame({'Timestamp':pd.to_datetime(['2017-04-05 15:21:03','2017-04-05 19:10:52'])})
print (df)
            Timestamp
0 2017-04-05 15:21:03
1 2017-04-05 19:10:52

current_date = pd.to_datetime('2017-04-05')
reduce_to_date = current_date - pd.DateOffset(days=7)

df['Timestamp'] = df['Timestamp'] - reduce_to_date + pd.to_datetime(df['Timestamp'].dt.date)
print (df)
            Timestamp
0 2017-04-12 15:21:03
1 2017-04-12 19:10:52

如果我理解正确,你可以简单地减去一个偏移量

passed_df['Timestamp'] -=  pd.offsets.Day(7)
演示

passed_df=pd.DataFrame(dict(
        Timestamp=pd.to_datetime(['2017-04-05 15:21:03', '2017-04-05 19:10:52'])
    ))

# Make sure your `Timestamp` column is datetime.
# Mine is because I constructed it that way.
# Use
# passed_df['Timestamp'] = pd.to_datetime(passed_df['Timestamp'])

passed_df['Timestamp'] -=  pd.offsets.Day(7)

print(passed_df)

            Timestamp
0 2017-03-29 15:21:03
1 2017-03-29 19:10:52

使用strftime

虽然这并不理想,但我想指出一点,您完全可以使用
strftime
。当您的列是datetime时,您可以通过
dt
日期访问器使用
dt.strftime
。您可以创建一个动态列,在其中指定目标日期,如下所示:

pd.to_datetime(passed_df.Timestamp.dt.strftime('{} %H:%M:%S'.format('2017-03-29')))

0   2017-03-29 15:21:03
1   2017-03-29 19:10:52
Name: Timestamp, dtype: datetime64[ns]

查看熊猫中的非索引datetime列添加的功能。太棒了!谢谢你的帮助。我很高兴能帮助你。天气真好!这完全符合我的期望。我在来这里之前挣扎了几个小时。我知道这可能很简单,只是找不到正确的语法或方法。我最初尝试使用偏移量,但因为我有4个以上的日期,所以我不能使用简单的偏移量.Day(7),将每个日期移动7天,但它们仍然不一样。我试着用一个内联方程式来动态地分配一天,但这带来了一些错误。我确实看到了一些使用strftime的例子,但这似乎太庞大了,并不是最好的Python方法。