我有一个包含几个时间戳的数据帧.我正在try 找到某些不满足条件的时间戳,并根据来自另一个时间戳和正在测试的当前时间戳的片段来计算它们的新时间戳值.

df = pd.DataFrame(data={'col1': [pd.Timestamp(2021, 1, 1, 12), pd.Timestamp(2021, 1, 2, 
                                 12), pd.Timestamp(2021, 1, 3, 12)], 
                        'col2': [pd.Timestamp(2021, 1, 4, 12), pd.Timestamp(2021, 1, 5, 
                                12), pd.Timestamp(2021, 1, 6, 12)]})
print(df)
#                 col1                col2
# 0 2021-01-01 12:00:00 2021-01-04 12:00:00
# 1 2021-01-02 12:00:00 2021-01-05 12:00:00
# 2 2021-01-03 12:00:00 2021-01-06 12:00:00

我正试着做这样的事情:

testDate = pd.Timestamp(2021, 1, 2, 16)
df['newCol'] = df['col1'].where(df['col1'].dt.date <= testDate.date(), pd.Timestamp(year=testDate.year, month=testDate.month, day=testDate.day, hour=df['col1'].dt.hour))

不过,我得到了一个关于歧义的错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果我go 掉最后一位hour=df['col1'].dt.hour,代码就会运行,所以我知道这与此有关,但我不明白为什么它会抱怨真实性,因为这一小段代码没有测试任何条件,它只是赋值.我认为这是因为我正在try 使用正在迭代的值来计算新值,但如果我try 使用整数而不是时间戳来执行此过程,则运行得很好:

df = pd.DataFrame(data={'col1': [1,2,3], 'col2': [4,5,6]})
print(df)
#   col1  col2
# 0     1     4
# 1     2     5
# 2     3     6

testInt = 2
df['newCol'] = df['col1'].where(df['col1'] < testInt, df['col1'] + 2)
print(df)
#   col1  col2  newCol
# 0     1     4       1
# 1     2     5       4
# 2     3     6       5

做我想做的事,正确的方式是什么?

推荐答案

您必须首先创建目标系列:

target = (pd.Series(testDate.normalize(), index=df.index)
            + (df['col1'] - df['col1'].dt.normalize()))

df['newCol'] = df['col1'].where(df['col1'] <= testDate, target)

输出:

>>> df
                 col1                col2              newCol
0 2021-01-01 12:00:00 2021-01-04 12:00:00 2021-01-01 12:00:00
1 2021-01-02 12:00:00 2021-01-05 12:00:00 2021-01-02 12:00:00
2 2021-01-03 12:00:00 2021-01-06 12:00:00 2021-01-02 12:00:00

>>> target
0   2021-01-02 12:00:00
1   2021-01-02 12:00:00
2   2021-01-02 12:00:00
dtype: datetime64[ns]

如果我删除最后一位hour=df 'col1 '].dt.hour,代码将运行,所以我知道它与此有关,但我不明白为什么它会抱怨真实性,因为这一小段代码没有测试任何条件

问题不在于条件.pd.Timestamp采用一些参数(年、月、日……).这些参数中的每个参数都采用标量值而不是向量(df['col1'].dt.hour).这就是该函数引发ValueError异常的原因.

Python相关问答推荐

我可以使用极点优化这个面向cpu的pandas代码吗?

基本链合同的地址是如何计算的?

如何在msgraph.GraphServiceClient上进行身份验证?

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

将输入管道传输到正在运行的Python脚本中

pandas滚动和窗口中有效观察的最大数量

如何让Flask 中的请求标签发挥作用

管道冻结和管道卸载

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

如何过滤包含2个指定子字符串的收件箱列名?

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

当独立的网络调用不应该互相阻塞时,'

avxspan与pandas period_range

如果条件不满足,我如何获得掩码的第一个索引并获得None?

我对我应该做什么以及我如何做感到困惑'

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

如何在表中添加重复的列?

多处理队列在与Forking http.server一起使用时随机跳过项目

如何保持服务器发送的事件连接活动?

合并与拼接并举